示例代码来自 here :

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 是这样写的吗?

最佳答案

  • Fiber 在 EventMachine 中创建和触发
  • 目标是 (a) 获取页面和 (b) 对其进行处理
  • Fiber 应该暂停,直到取到页面,这就是 http_get
  • 的作用
  • http = EventMachine::HttpRequest.new(url).get 不会触发任何事情:EventMachine 需要重新控制,这就是 Fiber.yield
  • 的作用
  • 一旦 EventMachine 完成获取页面的工作,它就会触发回调并恢复在 puts ...
  • 处停止的 Fiber

    更清楚?

    关于ruby - 请解释这个 ruby 纤维示例背后的逻辑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12662556/

    10-12 12:17