ruby - 请解释这个 ruby 纤维示例背后的逻辑

标签 ruby eventmachine fiber

示例代码来自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 运行 block 的上下文中,作者创建了一个纤程并使用 resume 立即运行它。但是,我不明白为什么 http_get 逻辑是以这种方式构建的。我的意思是,它使用当前纤程(在本例中应该是在 EM 运行 block 中创建的纤程),它启动一个可能失败或成功的 http 请求,然后恢复当前纤程。之后它只是在光纤上调用 yield。自从他调用 yield 后,究竟会运行什么?有人可以解释一下为什么 http_get 是这样写的吗?

最佳答案

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

更清晰?

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

相关文章:

避免查找结果出现阴影的 Ruby 方法

ruby-on-rails - rails : Opposite of Hash#to_param

Ruby eventmachine 编译错误

ruby-on-rails - 在 OSX Yosemite 上安装 EventMachine gem 时出错

c# - C# : are they faster than iterators, 中的纤程,有人使用过它们吗?

ruby - 使用 mechanize 并得到未初始化的常量 Object::WWW (NameError)

ruby - ruby 的 rand 方法应该接受 Range 对象吗?

ruby - 使用 ruby​​ 的异步 HTTP 请求

multithreading - 如何将纤维传递给线程?

c++ - 轻量级、可移植的 C++ 纤程,MIT 许可证