La creazione di un AsyncResult
oggetto dall'id dell'attività è il modo consigliato nelle FAQ per ottenere lo stato dell'attività quando l'unica cosa che hai è l'ID dell'attività.
Tuttavia, a partire da Celery 3.x, ci sono avvertimenti significativi che potrebbero mordere le persone se non prestano loro attenzione. Dipende davvero dallo scenario del caso d'uso specifico.
Per impostazione predefinita, Celery non registra uno stato "in esecuzione".
Al fine di sedano per registrare che un compito è in esecuzione, è necessario impostare task_track_started
a True
. Ecco una semplice attività che verifica questo:
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
Quando task_track_started
è False
, che è l'impostazione predefinita, lo stato mostra PENDING
anche se l'attività è iniziata. Se imposti task_track_started
su True
, lo stato saràSTARTED
.
Lo stato PENDING
significa "non lo so".
Un AsyncResult
con lo stato PENDING
non significa altro che Celery non conosce lo stato del compito. Ciò potrebbe essere dovuto a diversi motivi.
Per prima cosa, AsyncResult
può essere costruito con ID attività non validi. Tali "compiti" saranno considerati in sospeso da Celery:
>>> task.AsyncResult("invalid").status
'PENDING'
Ok, quindi nessuno fornirà ID ovviamente non validi a AsyncResult
. Abbastanza giusto, ma ha anche l'effetto che AsyncResult
considererà anche un'attività che è stata eseguita con successo ma che Celery ha dimenticato come essere PENDING
. Di nuovo, in alcuni casi d'uso questo può essere un problema. Parte del problema dipende dal modo in cui Celery è configurato per conservare i risultati delle attività, perché dipende dalla disponibilità delle "lapidi" nel backend dei risultati. ("Tombstones" è il termine utilizzato nella documentazione di Celery per i blocchi di dati che registrano il modo in cui l'attività è terminata.) L'utilizzo AsyncResult
non funzionerà affatto se task_ignore_result
èTrue
. Un problema più fastidioso è che Celery fa scadere le lapidi per impostazione predefinita. Ilresult_expires
l'impostazione predefinita è impostata su 24 ore. Quindi, se avvii un'attività e registri l'id nella memoria a lungo termine e più 24 ore dopo, crei un AsyncResult
con esso, lo stato sarà PENDING
.
Tutti i "compiti reali" iniziano nello PENDING
stato. Quindi PENDING
eseguire un'attività potrebbe significare che l'attività è stata richiesta ma non è mai progredita oltre (per qualsiasi motivo). Oppure potrebbe significare che l'attività è stata eseguita ma Celery ha dimenticato il suo stato.
Ahia! AsyncResult
non funzionerà per me. Cos'altro posso fare?
Preferisco tenere traccia degli obiettivi piuttosto che tenere traccia delle attività stesse . Conservo alcune informazioni sulle attività, ma è davvero secondario per tenere traccia degli obiettivi. Gli obiettivi sono conservati in un magazzino indipendente da Celery. Quando una richiesta deve eseguire un calcolo dipende dal raggiungimento di un obiettivo, controlla se l'obiettivo è già stato raggiunto, se sì, utilizza questo obiettivo memorizzato nella cache, altrimenti avvia l'attività che avrà effetto sull'obiettivo e invia a il client che ha effettuato la richiesta HTTP una risposta che indica che dovrebbe attendere un risultato.
I nomi delle variabili e i collegamenti ipertestuali sopra riportati sono per Celery 4.x. In 3.x le variabili e collegamenti corrispondenti sono: CELERY_TRACK_STARTED
, CELERY_IGNORE_RESULT
, CELERY_TASK_RESULT_EXPIRES
.
x
?