2012-09-30 3 views
3

예제 코드는 here에서 뒤에 논리를 설명해주십시오 :이 루비 섬유 예를

def http_get(url) 
    f = Fiber.current 
    http = EventMachine::HttpRequest.new(url).get 

    # resume fiber once http call is done 
    http.callback { f.resume(http) } 
    http.errback { f.resume(http) } 

    return Fiber.yield 
end 

EventMachine.run do 
    Fiber.new{ 
    page = http_get('http://www.google.com/') 
    puts "Fetched page: #{page.response_header.status}" 

    if page 
     page = http_get('http://www.google.com/search?q=eventmachine') 
     puts "Fetched page 2: #{page.response_header.status}" 
    end 
    }.resume 
end 

그래서, EM 실행 블록의 맥락에서, 저자의이 섬유를 생성하고 resume으로 즉시 실행. 그러나, 나는 왜 그런 식으로 http_get 논리가 구조화되는지 이해하지 못한다. 내 말은, 그것은 현재의 광섬유 (이 경우에는 EM 실행 블록에서 생성 된 것이어야 함)를 취하는 것이며, 실패하거나 성공할 수있는 http 요청을 시작하고 현재 광섬유를 다시 시작합니다. 이후에는 광섬유에 yield이 호출됩니다. 그가 수익을 부르고 있기 때문에 정확히 무엇이 운영 될 것입니까? 누군가 http_get이 그런 식으로 쓰여진 이유를 설명해 주실 수 있습니까?

답변

2
  1. 섬유는 EventMachine에서 생성 트리거
  2. 목표는
  3. 는, 이것은 페이지를 가져올 때까지 섬유가 일시 중지해야
  4. 입니다 (a)는 페이지를 가져 오지와 (b) 그 작업입니다 http_get
  5. http = EventMachine::HttpRequest.new(url).get의 역할은 아무것도 실행되지 않습니다 EventMachine 다시 고삐를 얻기 위해 필요, 즉 Fiber.yield
  6. 의 역할이다 EventMachine 페이지를 얻는 작업을 수행 한 후에는 콜백을 트리거하고 정지 한 섬유를 다시 시작에

클리어어요?

+0

왜 광섬유를 일시 정지해야합니까? 또한 코드는 'puts'에서 멈 춥니 다. 가져온 페이지 : # {page.response_header.status} "'광섬유가 실행되고 완료 될 때까지? – Geo

+1

을 사용하여 EventMachine에 손을 넘기십시오 – apneadiving

+0

감사합니다. 이제는 분명합니다. EM 경험이 있으니 http://stackoverflow.com/questions/12663944/how-can-i-load-all-the-objects-inside-a-table-and-keep에서 잠시 살펴볼 수 있습니까? -eventmachine-responsive? 어쩌면 내가 뭘 잘못하고 있는지 알아낼 수 있을까? – Geo