示例代码:
require 'eventmachine'
t = Thread.new { EM.run }
op = proc {
op2 = proc {
sleep 1
puts 'op2 finishing'
}
cb2 = proc {
sleep 1
puts 'cb2 finishing'
}
EM.defer(op2, cb2)
puts 'op finishing'
}
cb = proc {
puts 'cb finishing'
}
EM.defer(op, cb)
while (!EM.defers_finished?) do
puts 'defers not finished, sleeping...'
sleep 1
end
EM.stop
上述计划失败的时间约为10%:
eventmachine-1.0.3/lib/eventmachine.rb:1039:in `signal_loopbreak': eventmachine not initialized: evma_signal_loopbreak (RuntimeError)
eventmachine-1.0.3/lib/eventmachine.rb:1039:in `block in spawn_threadpool'
看来EM.defers_finished?()有时会返回true,即使仍有未完成的延迟。我是EventMachine的新手,所以也许我做错了,但是看起来似乎有些东西在EventMachine中表现不正确。
关于为什么我没有做典型的“EM.run do”的一些背景,这是在Passenger进程下运行的,因此你不能以通常的方式启动EventMachine。请参阅http://www.railstips.org/blog/archives/2011/05/04/eventmachine-and-passenger/和http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html
答案 0 :(得分:2)
这里link,它说你需要这一行:
# Wait for the reactor to start
while not EM.reactor_running?; end
..而你的错误似乎表明你错过了这样的东西:
eventmachine not initialized