4

示例代码来自这里

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写吗?

4

1 回答 1

3
  1. Fiber 在 EventMachine 中创建和触发
  2. 目标是(a)获取页面并(b)处理它
  3. Fiber应该暂停直到页面被抓取,这是的作用http_get
  4. http = EventMachine::HttpRequest.new(url).get不会触发任何东西:EventMachine 需要重新控制,这就是Fiber.yield
  5. 一旦 EventMachine 完成获取页面的工作,它就会触发回调并恢复停止的 Fiberputs ...

更清晰?

于 2012-09-30T16:35:32.757 回答