em-synchrony のドキュメントは、このコードがファイバーを使用していることを意味するこの記事へのリンクです。
require 'eventmachine'
require 'fiber'
require 'em-http-request'
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://myurl')
puts "Fetched page: #{page.response}"
EventMachine.stop
}.resume
end
...これは、em-synchrony を使用したこのはるかに単純なコードと同等です。
require 'em-synchrony'
require 'em-http-request'
EventMachine.synchrony do
page = EventMachine::HttpRequest.new("http://myurl").get
p "No callbacks! Fetched page: #{page.response}"
EventMachine.stop
end
ただし、2 つを実行すると、異なる結果が生成されます。最初の例では、ファイバーは HTML 応答が返されるまで処理を続けますが、2 番目の例では、応答を待たずにすぐに印刷されるように見え、その結果、印刷された応答は空になります。私の読み間違いやタイプミスですか、それとも記事が実際に間違ったことを示唆しているのでしょうか?