Em-synchrony示例代码未按预期工作

时间:2012-01-25 14:16:17

标签: ruby eventmachine fibers

em-synchrony文档链接到this article,暗示这个代码带有光纤:

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

然而,运行两者会产生不同的结果。在第一个光纤产生,直到HTML响应返回,而第二个似乎立即打印而不等待响应,因此打印的响应是空的。我是误读还是输入错误,或者文章实际上是在暗示错误的东西?

1 个答案:

答案 0 :(得分:2)

您需要使用知道如何使用EventMachine::HttpRequest的{​​{1}}扩展版。

更改

EventMachine.synchrony

require 'em-http-request'

这反过来将需要“em-http-request”,并将修补require "em-synchrony/em-http" #get, #head, #post, #delete, #put方法以与Fibers一起使用。

这是the link to source code of em-synchrony/em-http