usamos Rails y EventMachine juntos, y cuando usamos ese combo con Passenger hay una configuración muy específica que debe hacerse. Después de muchas pruebas y errores, obtuve la inicialización de EventMachine funcionando bien, pero me gustaría entender el código un poco mejor. Como puede ver a continuación en este fragmento de código, nuestro inicializador busca Pasajero, y luego verifica si se trata de un proceso bifurcado antes de reiniciar EventMachine.EventMachine y Ruby Threads: ¿qué está pasando realmente aquí?
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
Mi pregunta está relacionada con la EM.reactor_running? y comandos EM.stop. Si Passenger ha bifurcado nuestro proceso, ¿por qué tengo que reiniciar la referencia de EM en un nuevo hilo? Si EM.reactor_running? devuelve verdadero, ¿a qué instancia de EM estoy haciendo referencia?
Puede ver el código de inicialización completa en nuestro blog aquí http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html
Gran descripción gracias. Tengo clara la necesidad de ejecutar EM en su propio hilo, pero cuando dices "EM loop que puede quedar", ahí es donde estoy un poco incierto. ¿Cómo se "sobra" un bucle EM? No estoy cerrando el proceso principal 'EM, ¿correcto? – Joshua
Eso es exactamente lo que estás haciendo. Estás cerrando un EM potencialmente remanente del proceso principal. En caso de que se ejecute un bucle EM en el proceso principal, también se bifurcará, pero generalmente no le interesan en absoluto los descriptores de archivo que le quedan al padre, por lo que comienza desde el principio. Dado que es poco probable que el Pasajero ejecute un bucle EM por sí mismo, esta es más una medida de seguridad que cualquier otra cosa. – roidrage
En una línea similar, estoy trabajando con RabbitMQ a través de la gema ruby-amqp, dentro de una aplicación websocket que se ejecuta en thin. Thin tiene su propio bucle de EventMachine, y actualmente estoy usando EventMachine.next_tick para entrar y hacer mis cosas de amqp. ¿Es correcto o debería usar EventMachine.fork_reactor para darle a AMQP su propio EM para usar? – wchrisjohnson