es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  ,

Answer

  1. Avatar for 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:

    from celery import signals
    from flask import Flask, g
    
    app = Flask(__name__)
    
    @signals.worker_init.connect
    def bootstrap_flask_app(**kwargs):
      # Inicializar la aplicación Flask en el proceso de trabajo
      g.app = app
    
    @signals.worker_process_init.connect
    def flask_app_init(**kwargs):
      # Inicializar el contexto de la solicitud en el proceso de trabajo
      with app.app_context():
        pass # Inicializar cualquier extensión que dependa del contexto de la solicitud
    

    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.

Comments are closed.