Пример кода Em-synchrony не работает должным образом - PullRequest
1 голос
/ 25 января 2012

Документация 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 не возвращается, тогда как второе, кажется, печатает сразу, не дожидаясь ответа, и в результате напечатанный ответ становится пустым. Я неправильно читаю или опечатки, или статья на самом деле предлагает не то?

1 Ответ

2 голосов
/ 25 января 2012

Вам нужно использовать расширенную версию EventMachine::HttpRequest, которая умеет работать с EventMachine.synchrony.

Изменить

require 'em-http-request'

до

require "em-synchrony/em-http" 

Это, в свою очередь, потребует «em-http-request» и исправит #get, #head, #post, #delete, #put методы EventMachine::HttpRequest для работы с волокнами.

Вот ссылка на исходный код em-synchrony / em-http .

...