Така че изглежда, че трябва да осъществя достъп до AsyncResult
само чрез моя екземпляр на приложението Celery, вместо чрез Celery, или предайте екземпляра на приложението Celery като аргумент.
Така че това не работи:
from celery.result import AsyncResult
@app.route('/status/<task_id>')
def get_status(task_id):
task = AsyncResult(task_id)
return task.state
Това работи:
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
Това също работи:
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
Предполагам, че това се случва чрез извикване на AsyncResult
директно от Celery, той няма достъп до конфигурациите на Celery, следователно смята, че няма бекенд, конфигуриран за запитване на резултати.
Но това би обяснило само пълния отказ на функцията, а не хаотичното поведение. Предполагам, че това се дължи на различни теми и ситуации, в които екземплярът на приложението е важен, така че Celery го намира, но не е много сигурен.
Проведох няколко теста и изглежда отново работи добре след промяна на импортирания AsyncResult
, но ще продължа да ровя.