我们一起使用Rails和EventMachine,并且在与Passenger一起使用该组合时,需要完成一些非常特定的设置。经过大量的试验和错误之后,我的EventMachine初始化工作正常,但我想更好地理解代码。正如你在下面的代码片段中看到的,我们的初始化器检查Passenger,然后在重新启动EventMachine之前检查它是否是分叉进程。EventMachine和Ruby线程 - 这里究竟发生了什么?
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
# for passenger, we need to avoid orphaned threads
if forked && EM.reactor_running?
EM.stop
end
Thread.new {
EM.run do
我的问题是关于EM.reactor_running?和EM.stop命令。如果Passenger已经分叉我们的流程,为什么我需要在新线程中重新启动EM引用?如果EM.reactor_running?返回true,我引用了哪个EM实例?
你可以看到我们这里的博客http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html
很好的描述谢谢。我清楚需要在自己的线程中运行EM,但是当你说“可能剩下的EM回路”时,这就是我不清楚的地方。 EM循环如何“遗留”?我没有关闭父进程'EM,对吗? – Joshua
这正是你在做的。您正在关闭可能遗留在父进程中的EM。如果一个EM循环运行在父进程中,它也会被分叉,但是你通常不关心父进程剩下的文件描述符,所以你需要从头开始。鉴于Passenger不太可能独立运行EM环路,这比其他任何安全措施都更重要。 – roidrage
与此类似,我正在通过ruby-amqp gem与RabbitMQ一起工作,在一个websocket应用程序内运行。瘦有它自己的EventMachine循环,我目前正在使用EventMachine.next_tick打破并做我的amqp的东西。这是正确的,或者我应该使用EventMachine.fork_reactor给AMQP它自己的EM使用? – wchrisjohnson