Entonces, tengo una aplicación que usa Twisted + Stomper como un cliente STOMP que cultiva trabajo en multiprocesamiento. Piscina de trabajadores.cliente de red twisted con multiprocesamiento de los trabajadores?
Esto parece funcionar bien cuando sólo tiene que utilizar un script en Python para disparar con esto, que (simplificado) se ve algo como esto:
# stompclient.py
logging.config.fileConfig(config_path)
logger = logging.getLogger(__name__)
# Add observer to make Twisted log via python
twisted.python.log.PythonLoggingObserver().start()
# initialize the process pool. (child processes get forked off immediately)
pool = multiprocessing.Pool(processes=processes)
StompClientFactory.username = username
StompClientFactory.password = password
StompClientFactory.destination = destination
reactor.connectTCP(host, port, StompClientFactory())
reactor.run()
Como esto está empaquetado para su despliegue, pensé que iba a aprovechar del script twistd y ejecútelo desde un archivo tac.
Aquí está mi archivo tac muy similares de aspecto:
# stompclient.tac
logging.config.fileConfig(config_path)
logger = logging.getLogger(__name__)
# Add observer to make Twisted log via python
twisted.python.log.PythonLoggingObserver().start()
# initialize the process pool. (child processes get forked off immediately)
pool = multiprocessing.Pool(processes=processes)
StompClientFactory.username = username
StompClientFactory.password = password
StompClientFactory.destination = destination
application = service.Application('myapp')
service = internet.TCPClient(host, port, StompClientFactory())
service.setServiceParent(application)
En aras de la ilustración, he derrumbado o cambiado algunos detalles; es de esperar que no fueran la esencia del problema. Por ejemplo, mi aplicación tiene un sistema de complementos, el grupo se inicializa mediante un método independiente y luego el trabajo se delega en el grupo utilizando pool.apply_async() pasando uno de los métodos de proceso() de mi complemento.
Por lo tanto, si ejecuto el script (stompclient.py), todo funciona como se esperaba.
También parece funcionar bien si me quedo giro en el modo de no-daemon (-n): sin embargo
twistd -noy stompclient.tac
, no lo hace trabajo cuando corro en modo demonio:
twistd -oy stompclient.tac
Parece que la aplicación se inicia correctamente, pero cuando intenta interrumpir el trabajo, simplemente se bloquea. Por "cuelga", quiero decir que parece que nunca se le pide al proceso hijo que haga nada y el padre (que se llama pool.apply_async()) simplemente se sienta allí esperando que la respuesta regrese.
Estoy seguro de que estoy haciendo algo estúpido con el multiprocesamiento Twisted +, pero realmente espero que alguien pueda explicarme el error en mi enfoque.
¡Gracias de antemano!
Esto fue * extremadamente * útil. ¡Gracias! –