0

サンプルコード:

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

4

1 に答える 1