Il semble donc que j'ai besoin d'accéder à AsyncResult
uniquement via mon instance d'application Celery, au lieu de via Celery, ou transmettez l'instance d'application Celery comme argument.
Donc, cela ne fonctionne pas :
from celery.result import AsyncResult
@app.route('/status/<task_id>')
def get_status(task_id):
task = AsyncResult(task_id)
return task.state
Cela fonctionne :
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
Cela fonctionne aussi :
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
Je suppose que ce qui se passe, c'est qu'en appelant AsyncResult
directement depuis Celery, il n'accède pas aux configurations de Celery, il pense donc qu'il n'y a pas de backend configuré pour interroger les résultats.
Mais cela n'expliquerait qu'un échec complet de la fonction, et non le comportement erratique. Je suppose que c'est à cause de différents threads et de situations dans lesquelles l'instance de l'application est importante, donc Celery le trouve, mais pas trop sûr.
J'ai effectué quelques tests et semble fonctionner à nouveau correctement après avoir modifié le AsyncResult
importé , mais je vais continuer à creuser.