Wygląda więc na to, że muszę uzyskać dostęp do AsyncResult
tylko przez moją instancję aplikacji Celery, zamiast przez Celery, lub przekaż instancję aplikacji Celery jako argument.
Więc to nie działa:
from celery.result import AsyncResult
@app.route('/status/<task_id>')
def get_status(task_id):
task = AsyncResult(task_id)
return task.state
To działa:
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
To również działa:
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
Zgaduję, co się dzieje, wywołując AsyncResult
bezpośrednio z Celery, nie ma dostępu do konfiguracji Celery, dlatego uważa, że nie ma backendu skonfigurowanego do odpytywania wyników.
Ale to tylko wyjaśniałoby całkowitą awarię funkcji, a nie błędne zachowanie. Zgaduję, że dzieje się tak z powodu różnych wątków i sytuacji, w których instancja aplikacji jest ważna, więc Celery ją znajduje, ale nie jest zbyt pewny.
Przeprowadziłem kilka testów i wydaje się, że po zmianie zaimportowanego AsyncResult
znowu działa dobrze , ale będę kopać dalej.