Пожалуйста, объясните логику этого примера рубинового волокна.

Пример кода взят из здесь :

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://www.google.com/')
    puts "Fetched page: #{page.response_header.status}"

    if page
      page = http_get('http://www.google.com/search?q=eventmachine')
      puts "Fetched page 2: #{page.response_header.status}"
    end
  }.resume
end

Таким образом, в контексте блока запуска EM автор создает волокно и сразу запускает его с помощью resume. Но я не понимаю, почему логика http_get построена таким образом. Я имею в виду, что он берет текущее волокно (которое в данном случае должно быть создано в блоке запуска EM), запускает http-запрос, который может быть неудачным или успешным, и возобновляет текущее волокно. После этого он просто вызывает yield на оптоволокне. Что именно будет работать, так как он вызывает yield? Может кто-нибудь объяснить, почему http_get пишется именно так?


person Geo    schedule 30.09.2012    source источник


Ответы (1)


  1. Волокно создается и запускается в EventMachine
  2. цель состоит в том, чтобы (а) получить страницу и (б) работать над ней
  3. Волокно должно быть приостановлено до тех пор, пока страница не будет загружена, это роль http_get
  4. http = EventMachine::HttpRequest.new(url).get ничего не запускает: EventMachine нужно вернуть поводья, это роль Fiber.yield
  5. После того, как EventMachine выполнил задание по получению страницы, он запускает обратный вызов и возобновляет работу волокна, которое было остановлено на puts ....

Яснее?

person apneadiving    schedule 30.09.2012
comment
Почему волокно должно быть приостановлено? Кроме того, код останавливается на puts "Fetched page: #{page.response_header.status}" до тех пор, пока волокно не получит возможность запуститься и завершиться? - person Geo; 30.09.2012
comment
передать руку EventMachine - person apneadiving; 30.09.2012
comment
Спасибо, теперь понятно. Поскольку у вас есть некоторый опыт работы с EM, не могли бы вы быстро взглянуть на stackoverflow.com/questions/12663944/ ? Может быть, вы можете заметить, что я делаю неправильно? - person Geo; 30.09.2012
comment
Есть ли состояние гонки? например возможно ли, чтобы возобновление вызывалось до выхода? - person ioquatix; 18.01.2014