1

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 番目の例では、応答を待たずにすぐに印刷されるように見え、その結果、印刷​​された応答は空になります。私の読み間違いやタイプミスですか、それとも記事が実際に間違ったことを示唆しているのでしょうか?

4

1 に答える 1

2

EventMachine::HttpRequestの操作方法を知っているの拡張バージョンを使用する必要がありますEventMachine.synchrony

変化する

require 'em-http-request'

require "em-synchrony/em-http" 

これには「em-http-request」が必要であり、Fiber で動作するように#get, #head, #post, #delete, #putメソッドにパッチを適用EventMachine::HttpRequestします。

em-synchrony/em-http のソース コードへのリンクは次のとおりです。

于 2012-01-25T14:42:52.037 に答える