2011-11-23 31 views
5

Tengo una situación en la que quiero ejecutar varias EventMachines en Ruby: ¿alguien tiene experiencia con esto? (Debo escribir un caso de prueba para hacerlo yo mismo si no. Esté atento).Multiple Ruby EventMachines en un solo proceso: ¿es posible?

Seamos claros: quiero instanciar dos hilos por mí mismo, y llamar al EventMachine.run en ambos hilos, así que realmente tengo dos bucles del reactor.

La razón es que estoy escribiendo un bus de mensajes asíncrono con la gema AMQP, que usa EventMachine. Eso está bien, pero quiero hacer que un componente separado, modular que se puede utilizar dentro de dos aplicaciones:

  • uno que tiene su propio bucle de bloqueo interfaz gráfica de usuario (que no puede ser simulado llamando garrapata de EventMachine - ¡Realmente bloques , y lo hace en una biblioteca C, así que no puedo hackearlo). Este es simple: simplemente inicie EM en su propio hilo, y comparta los mensajes entrantes entre bucles de una manera segura para hilos;
  • y otra aplicación que sí se está ejecutando en un circuito del reactor, lo que potencialmente podría compartir con el código AMQP (lo cual es bueno para los problemas de seguridad de rosca - aunque no tengo para hacer frente a ellos de todos modos para la aplicación arriba). Este es el que me hizo pensar ... ¿podría compartir el código del bus de mensajes con la aplicación anterior ejecutando dos EventMachines por separado?

¿Alguien tiene pensamientos?

Respuesta

5

bien, la excavación en documentos de EM, veo el cuerpo de EventMachine.run comienza con esto:

240:  if reactor_running? 
241:  (b = blk || block) and b.call # next_tick(b) 
242:  else 
     ... start the reactor ... 

Esto es impresionante. Parece que si ejecuta EventMachine.run en varios subprocesos, programará la definición de la segunda máquina, el bloque pasado a "ejecutar", en el reactor que ya se está ejecutando.

Me encanta esta biblioteca.

2

Usted respondió a sí mismo pero quería agregar mis 2 centavos sin el horrible estilo de los comentarios.

# this will start the eventmachine reactor 
EM::run do 

    # do something 

    # this will do nothing and the block passed to it will 
    # just be executed directly 
    EM::run do 
    # do something else 
    end 

end 
-1

si de ejecución del servidor múltiple en el mismo EM, tal vez causar algún problema. quizás puede iniciarlos en múltiples procesos para anular el mismo uso EM

Cuestiones relacionadas