Error de Celery prefork al iniciar el trabajador: request_stack es None.
Recientemente, me encuentro con un error al iniciar los workers en modo prefork en Celery (5.2.3). Aquí está su rastreo de pila:
[2022-01-06 00:56:18,535: ERROR/ForkPoolWorker-1] Proceso ForkPoolWorker-1
Traceback (most recent call last):
File “/Users/bryan/workplace/.venv/lib/python3.9/site-packages/billiard/process.py”, line 327, in _bootstrap
self.run()
File “/Users/bryan/workplace/.venv/lib/python3.9/site-packages/billiard/process.py”, line 114, in run
self._target(*self._args, **self._kwargs)
File “/Users/bryan/workplace/.venv/lib/python3.9/site-packages/billiard/pool.py”, line 289, in __call__
self.after_fork()
File “/Users/bryan/workplace/.venv/lib/python3.9/site-packages/billiard/pool.py”, line 421, in after_fork
self.initializer(*self.initargs)
File “/Users/bryan/workplace/.venv/lib/python3.9/site-packages/celery/concurrency/prefork.py”, line 75, in process_initializer
task.__trace__ = build_tracer(name, task, app.loader, hostname,
File “/Users/bryan/workplace/.venv/lib/python3.9/site-packages/celery/app/trace.py”, line 361, in build_tracer
push_request = request_stack.push
AttributeError: El objeto ‘NoneType’ no tiene el atributo ‘push’
Entiendo que ‘request_stack’ es None y por eso causa un error, pero aún no sé por qué ‘request_stack’ es None. Me gustaría pedir una idea para solucionarlo.
Otra información:
celery@D v5.2.3 (dawn-chorus)
macOS-12.1-x86_64-i386-64bit 2022-01-06 00:56:18
[config]
.> app: app:0x103a39970
.> transport: amqp://guest:**@localhost:5672//
.> results: redis://localhost:6379/0
.> concurrency: 1 (prefork)
.> task events: OFF (enable -E to monitor tasks in this worker)
[queues]
.> queues_DISTRIBUTED_QUEUE exchange=queues_DISTRIBUTED_QUEUE(direct) key=queues_DISTRIBUTED_QUEUE
davy.ai
Parece que
request_stack
es None debido a que el proceso de trabajo no está iniciando correctamente la aplicación Flask o inicializando el contexto de la solicitud correctamente.Una forma de solucionar esto es asegurarse de que la aplicación Flask se inicialice correctamente en el proceso de trabajo. Esto se puede hacer pasando la instancia de la aplicación Flask al trabajador de Celery utilizando la señal
worker_init
.Aquí tienes un ejemplo:
Este código configura manejadores de señales que inicializan la aplicación Flask y el contexto de la solicitud en el proceso de trabajo de Celery.
Ten en cuenta que algunas extensiones de Flask pueden requerir una configuración adicional para funcionar correctamente en los procesos de trabajo de Celery. Asegúrate de leer la documentación de las extensiones que estás utilizando y seguir los pasos de configuración recomendados para Celery.