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

但是,运行两者会产生不同的结果。在第一个中,纤维产生直到 HTML 响应返回,而第二个似乎立即打印而不等待响应,因此打印的响应为空。我是误读还是打错了,还是文章实际上暗示了错误的事情?

4

1 回答 1

2

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

改变

require 'em-http-request'

require "em-synchrony/em-http" 

这反过来将需要“em-http-request”,并将修补与 Fibers 一起工作的#get, #head, #post, #delete, #put方法。EventMachine::HttpRequest

这是em-synchrony/em-http 的源代码链接

于 2012-01-25T14:42:52.037 回答