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

时间:2012-09-30 15:43:47

标签: 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运行块的上下文中,作者创建了一个光纤并立即使用resume运行它。但是,我不明白为什么http_get逻辑以这种方式构造。我的意思是,它采用当前光纤(在这种情况下应该是在EM运行块中创建的光纤),它启动一个可能失败或成功的http请求,并恢复当前光纤。然后它只需在光纤上调用yield。自从他称之为收益后,究竟将会运行什么?有人可以解释一下为什么http_get按照它的方式编写?

1 个答案:

答案 0 :(得分:3)

  1. 在EventMachine中创建并触发光纤
  2. 目标是(a)获取页面和(b)处理它
  3. 应该暂停光纤直到获取页面,这是http_get
  4. 的作用
  5. http = EventMachine::HttpRequest.new(url).get不会触发任何事情:EventMachine需要重新获得缰绳,这是Fiber.yield
  6. 的作用
  7. 一旦EventMachine完成了获取页面的工作,它就会触发回调并恢复在puts ...停止的光纤
  8. 更清晰?