Пример кода взят из здесь :
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
на оптоволокне. Что именно будет работать, так как он вызывает yield? Может кто-нибудь объяснить, почему http_get
пишется именно так?