【问题标题】:Em-synchrony sample code not working as expectedEm-synchrony 示例代码未按预期工作
【发布时间】:2012-01-25 14:16:16
【问题描述】:

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 响应返回,而第二个似乎立即打印而不等待响应,因此打印的响应为空。是我读错了还是打错了,还是这篇文章实际上暗示了错误的东西?

【问题讨论】:

    标签: ruby eventmachine fibers


    【解决方案1】:

    您需要使用知道如何使用EventMachine.synchronyEventMachine::HttpRequest 的扩展版本。

    改变

    require 'em-http-request'
    

    require "em-synchrony/em-http" 
    

    这反过来将需要“em-http-request”,并将修补 EventMachine::HttpRequest#get, #head, #post, #delete, #put 方法以使用 Fibers。

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

    【讨论】:

    • 谢谢。当示例代码没有显示正确的 require 调用时,我总是很生气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多