サンプルコードはここからです:
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
なぜそのように書かれているのか説明してもらえますか?