Posso eseguire Pika's Connection.Ioloop.start () in un demone?
-
28-10-2019 - |
Domanda
Sto cercando di impostare un demone lavoratore per l'elaborazione di messaggi da RabbitMQ. Sto usando Pika e la sua selezione selezionata. Il codice funziona bene se non lo eseguo come un demone. posso usare
py worker.py
e
py worker.py &
con successo. Tuttavia, quando aggiungo
import daemon
with daemon.DaemonContext():
connection.ioloop.start()
Per worker.py, il codice, mentre non aumenta alcuna eccezione, smette di recuperare i messaggi dalla coda e massimizza il mio utilizzo della CPU. worker.py sembra esattamente come questo esempio.
Grazie.
Soluzione
Innanzitutto, non ho idea di dove tu abbia ottenuto questo modulo demone, ma ho notato che tu import
Daemon nel tuo esempio ma non Pika.
import daemon
with daemon.DaemonContext():
import pika
# any additional pika code here, maybe the creation of connection?
connection.ioloop.start()
Sospetto fortemente che tu usi PIKA (anche import esegue il codice all'interno del modulo) prima di trasformare il processo in un demone. Ciò significherebbe che hai risorse in RAM che vengono copiate quando le forcelle del demone e se questo modulo demone fa la cosa giusta, eventuali prese o file aperti saranno costretti a chiudere durante il processo.
È meglio non avere oggetti la cui vita copre il confine demone. Fai funzionare i demoni completamente separati da qualsiasi altra elaborazione e chiedi loro di comunicare con altri processi tramite passaggio di messaggi come AMQP o 0MQ.