为什么Ruby的EventMachine.defers_finished?()有时会在所有延迟完成时返回true?

时间:2013-08-18 18:34:49

标签: ruby-on-rails ruby eventmachine

示例代码:

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

1 个答案:

答案 0 :(得分:2)

这里link,它说你需要这一行:

# Wait for the reactor to start
while not EM.reactor_running?; end

..而你的错误似乎表明你错过了这样的东西:

eventmachine not initialized