Então parece que eu preciso acessar
AsyncResult
apenas por meio da minha instância do aplicativo Celery, em vez de por meio do Celery, ou passe a instância do aplicativo Celery como um argumento. Então, isso não funciona:
from celery.result import AsyncResult
@app.route('/status/<task_id>')
def get_status(task_id):
task = AsyncResult(task_id)
return task.state
Isso 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
Isso também 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
Acho que o que acontece é que, ao chamar
AsyncResult
diretamente do Celery, ele não acessa as configurações do Celery, portanto, pensa que não há back-end configurado para consultar os resultados. Mas isso só explicaria a falha completa da função, e não o comportamento errático. Eu estou supondo que isso é por causa de diferentes threads e situações em que a instância do aplicativo está sendo importante, então Celery a encontra, embora não tenha muita certeza.
Eu executei alguns testes e parece estar funcionando bem novamente depois de alterar o
AsyncResult
importado , mas vou continuar cavando.