サンプルコード:
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