示例代码来自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
是这样写的吗?
最佳答案
- 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/