我在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
Run Code Online (Sandbox Code Playgroud)
我期待输出为"ABCD",程序在"A"后暂停两秒钟.但是,它只是立即打印出"AC",然后在退出前等待两秒钟.我究竟做错了什么?
(作为参考,我试图在不使用em-synchrony的情况下重现本文中描述的em-synchrony风格的行为.)
编辑:这里有一些关于我最终要完成的事情的更多细节.我正在开发一个在Thin上运行的Grape API,并且每个路由处理程序必须在返回响应之前对数据存储,ZooKeeper,其他HTTP服务等进行各种串行调用.
em-synchrony真的很酷,但是我一直遇到从根光纤屈服或结果显示上述情况的非同步症状的问题.rack-fiber_pool似乎也很有用,但我不愿意使用它,因为开箱即用它会破坏我所有的Rack :: Test单元测试.
我将问题简化为上面的简单示例,因为我似乎对如何一起使用光纤和EventMachine存在根本的误解,这阻碍了我有效地使用更复杂的框架.