Utworzenie AsyncResultobiektu z identyfikatora zadania jest sposobem zalecanym w FAQ, aby uzyskać status zadania, gdy jedyne, co masz, to identyfikator zadania.
Jednak od wersji Selery 3.x istnieją poważne zastrzeżenia, które mogą ugryźć ludzi, jeśli nie zwrócą na nich uwagi. To naprawdę zależy od konkretnego scenariusza użycia.
Domyślnie Celery nie rejestruje stanu „uruchomiony”.
Aby Celery mógł zarejestrować, że zadanie jest uruchomione, musisz ustawić task_track_startedna True. Oto proste zadanie, które to sprawdza:
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
Kiedy task_track_startedjest False, co jest wartością domyślną, stan jest wyświetlany, PENDINGnawet jeśli zadanie zostało uruchomione. Jeśli ustawisz task_track_startedna True, stan będzie STARTED.
Stan PENDINGoznacza „nie wiem”.
Ze AsyncResultstanem PENDINGnie znaczy nic więcej niż to, że Seler nie zna statusu zadania. Może to mieć wiele przyczyn.
Po pierwsze, AsyncResultmożna je skonstruować z nieprawidłowymi identyfikatorami zadań. Takie „zadania” zostaną uznane przez Selera za oczekujące:
>>> task.AsyncResult("invalid").status
'PENDING'
Ok, więc nikt nie będzie podawał oczywiście nieprawidłowych identyfikatorów AsyncResult. W porządku, ale ma to również wpływ na AsyncResultuwzględnienie zadania, które zostało pomyślnie wykonane, ale o którym Seler zapomniał PENDING. Ponownie, w niektórych scenariuszach użycia może to stanowić problem. Część problemu zależy od tego, w jaki sposób Seler jest skonfigurowany do przechowywania wyników zadań, ponieważ zależy to od dostępności „nagrobków” w zapleczu wyników. ( „Nagrobki” jest długotrwałe stosowanie w dokumentacji naciowego na kawałki danych, rekord w jaki sposób zadanie zakończone.) Używanie AsyncResultnie będzie działać, jeśli w ogóle task_ignore_resultjest True. Bardziej irytującym problemem jest to, że Seler domyślnie traci ważność na nagrobkach. Plikresult_expiresustawienie domyślne to 24 godziny. Więc jeśli uruchomisz zadanie i zapiszesz identyfikator w pamięci długoterminowej, a później 24 godziny później, utworzysz AsyncResultz nim, status będzie PENDING.
Wszystkie „rzeczywiste zadania” zaczynają się w PENDINGstanie. Więc PENDINGpodjęcie zadania może oznaczać, że zadanie zostało poproszone, ale nigdy nie posunęło się dalej (z jakiegokolwiek powodu). Albo może oznaczać, że zadanie zostało wykonane, ale Celery zapomniał o swoim stanie.
Auć! AsyncResultnie zadziała dla mnie. Co jeszcze mogę zrobić?
Wolę śledzić cele niż same zadania . Zachowuję pewne informacje o zadaniach, ale jest to naprawdę drugorzędne w stosunku do śledzenia celów. Cele są przechowywane w magazynie niezależnym od selera. Kiedy żądanie wymaga wykonania obliczeń zależy od osiągnięcia jakiegoś celu, sprawdza, czy cel został już osiągnięty, jeśli tak, używa tego celu zapisanego w pamięci podręcznej, w przeciwnym razie rozpoczyna zadanie, które będzie miało wpływ na cel i wysyła do klient, który wysłał żądanie HTTP, otrzymał odpowiedź wskazującą, że powinien czekać na wynik.
Nazwy zmiennych i hiperłącza powyżej dotyczą programu Celery 4.x. W 3.x odpowiednie zmienne i linki są: CELERY_TRACK_STARTED, CELERY_IGNORE_RESULT, CELERY_TASK_RESULT_EXPIRES.
x?