我在 Ruby 1.9.2 下运行这个代码片段:
require "eventmachine"
require "fiber"
EM.run do
fiber = Fiber.new do
current_fiber = Fiber.current
EM.add_timer(2) do
print "B"
current_fiber.resume("D")
end
Fiber.yield
end
print "A"
val = fiber.resume
print "C"
print val
EM.stop
end
我期望输出是“ABCD”,程序在“A”之后暂停两秒钟。但是,它只是立即打印出“AC”,然后在退出之前等待两秒钟。我究竟做错了什么?
(作为参考,我试图在不使用 em-synchrony 的情况下重现本文中描述的 em-synchrony-style 行为。)
编辑:这里有一些关于我最终想要完成的更多细节。我正在开发一个在 Thin 上运行的 Grape API,每个路由处理程序必须在返回响应之前对数据存储、ZooKeeper、其他 HTTP 服务等进行一系列调用。
em-synchrony 真的很酷,但我一直遇到从根光纤屈服或结果显示上述情况的非同步症状的问题。rack-fiber_pool 似乎也可能有用,但我不愿意承诺使用它,因为开箱即用,它破坏了我所有的 Rack::Test 单元测试。
我将我的问题简化为上面的简单示例,因为我似乎对应如何一起使用纤维和 EventMachine 有一个基本的误解,这使我无法有效地使用更复杂的框架。