Het lijkt er dus op dat ik toegang moet krijgen tot AsyncResult
alleen via mijn Celery-app-instantie, in plaats van via Celery, of geef de Celery-app-instantie door als argument.
Dit werkt dus niet:
from celery.result import AsyncResult
@app.route('/status/<task_id>')
def get_status(task_id):
task = AsyncResult(task_id)
return task.state
Dit werkt:
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
Dit werkt ook:
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
Ik vermoed dat wat er gebeurt, is dat door AsyncResult
. te bellen rechtstreeks van Celery, heeft het geen toegang tot de configuraties van Celery, daarom denkt het dat er geen backend is geconfigureerd om resultaten op te vragen.
Maar dat zou alleen het volledige falen van de functie verklaren, en niet het grillige gedrag. Ik vermoed dat dit komt door verschillende threads en situaties waarin de app-instantie belangrijk is, dus Celery vindt het, maar niet al te zeker.
Ik heb een aantal tests uitgevoerd en het lijkt weer goed te werken na het wijzigen van de geïmporteerde AsyncResult
, maar ik blijf graven.