Entonces parece que necesito acceder a AsyncResult
solo a través de mi instancia de la aplicación Celery, en lugar de a través de Celery, o pase la instancia de la aplicación Celery como argumento.
Entonces, esto no funciona:
from celery.result import AsyncResult
@app.route('/status/<task_id>')
def get_status(task_id):
task = AsyncResult(task_id)
return task.state
Esto funciona:
from app import my_celery # Your own Celery Application Instance
@app.route('/status/<task_id>')
def get_status(task_id):
task = my_celery.AsyncResult(task_id)
return task.state
Esto también funciona:
from app import my_celery
from celery.result import AsyncResult
@app.route('/status/<task_id>')
def get_status(task_id):
task = AsyncResult(task_id, app=my_celery)
return task.state
Supongo que lo que sucede es que al llamar a AsyncResult
directamente desde Celery, no accede a las configuraciones de Celery, por lo que cree que no hay un backend configurado para consultar los resultados.
Pero eso solo explicaría la falla completa de la función, y no el comportamiento errático. Supongo que esto se debe a diferentes subprocesos y situaciones en las que la instancia de la aplicación es importante, por lo que Celery la encuentra, aunque no estoy muy seguro.
Realicé un par de pruebas y parece que vuelve a funcionar bien después de cambiar el AsyncResult
importado. , pero seguiré investigando.