示例代码来自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
按照它的方式编写?
答案 0 :(得分:3)
http_get
http = EventMachine::HttpRequest.new(url).get
不会触发任何事情:EventMachine需要重新获得缰绳,这是Fiber.yield
puts ...
停止的光纤更清晰?