2011-11-23 5 views
5

Ho una situazione in cui voglio eseguire più EventMachines in Ruby - qualcuno ha esperienza con questo? (Potrei scrivere un test case per farlo da solo se non lo sono. Resta sintonizzato).Multiple Ruby EventMachines in un unico processo: possibile?

Sia chiaro: voglio istanziare due thread personalmente e chiamare EventMachine.run in entrambi i thread, quindi ho davvero due loop di reattori.

Il motivo è che sto scrivendo un bus di messaggi asincroni con la gemma AMQP, che utilizza EventMachine. Va bene, ma voglio fare che un componente separato, modulare che può essere utilizzato entro due applicazioni:

  • uno che ha il suo anello di bloccaggio gui (che non può essere simulato chiamando segno di spunta dalla EventMachine - e 'davvero blocca e lo fa in una libreria C, quindi non posso modificarlo). Questo è semplice: è sufficiente avviare EM nella propria thread e condividere i messaggi in arrivo tra i loop in modalità thread-safe;
  • e un'altra applicazione che stessa è in esecuzione in un ciclo di reattore, che potrei potenzialmente condividere con il codice AMQP (che è utile per problemi di sicurezza dei thread - anche se devo indirizzarli comunque per l'app precedente). Questo è quello che mi ha fatto pensare ... potrei condividere il codice del bus del messaggio con l'app di cui sopra eseguendo due EventMachines separati?

Qualcuno ha pensieri?

risposta

5

OK, scavando nella documentazione di EM, vedo il corpo per EventMachine.run inizia con questo:

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

Questo è impressionante. Sembra che, se esegui EventMachine.run in più thread, pianificherà la definizione della seconda macchina - il blocco passato a "run" - sul reattore che è già in esecuzione.

Amo questa libreria.

2

Hai risposto da solo ma volevo aggiungere i miei 2 cent senza l'orribile stile dei commenti.

# 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

se più server eseguito nello stesso EM, potrebbe causare qualche problema. forse puoi avviare em in più processi per annullare l'uso dello stesso EM