Utworzenie AsyncResult
obiektu 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_started
na 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_started
jest False
, co jest wartością domyślną, stan jest wyświetlany, PENDING
nawet jeśli zadanie zostało uruchomione. Jeśli ustawisz task_track_started
na True
, stan będzie STARTED
.
Stan PENDING
oznacza „nie wiem”.
Ze AsyncResult
stanem PENDING
nie znaczy nic więcej niż to, że Seler nie zna statusu zadania. Może to mieć wiele przyczyn.
Po pierwsze, AsyncResult
moż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 AsyncResult
uwzglę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 AsyncResult
nie będzie działać, jeśli w ogóle task_ignore_result
jest True
. Bardziej irytującym problemem jest to, że Seler domyślnie traci ważność na nagrobkach. Plikresult_expires
ustawienie 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 AsyncResult
z nim, status będzie PENDING
.
Wszystkie „rzeczywiste zadania” zaczynają się w PENDING
stanie. Więc PENDING
podję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ć! AsyncResult
nie 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
?