Bir oluşturma AsyncResult
görevi id nesneyi olduğu önerildiği yolu SSS sahip olduğunuz tek şey görev kimliği olduğunda görev statüsü elde etmek.
Ancak Kereviz 3.x itibariyle, dikkat etmezlerse insanları ısırabilecek önemli uyarılar vardır. Gerçekten belirli kullanım senaryosuna bağlıdır.
Varsayılan olarak, Celery bir "çalışma" durumu kaydetmez.
Amacıyla Kereviz bir görev çalıştığını kaydetmesi için, ayarlamanız gerekir task_track_started
için True
. İşte bunu test eden basit bir görev:
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
Varsayılan değer olan ne zaman task_track_started
olur False
, PENDING
görev başlamış olsa bile durum gösterilir . Eğer ayarlarsanız task_track_started
için True
, o zaman devlet olacaktır STARTED
.
Devlet PENDING
"bilmiyorum" demektir.
Bir AsyncResult
devlet ile PENDING
daha Kereviz görevin durumunu bilmiyor daha değil ortalama bir şey yapmıyor. Bunun birçok nedeni olabilir.
Bir kere, AsyncResult
geçersiz görev kimlikleri ile oluşturulabilir. Bu tür "görevler" Kereviz tarafından beklemede sayılacaktır:
>>> task.AsyncResult("invalid").status
'PENDING'
Tamam, yani kimse açıkça geçersiz kimlikleri beslemeyecek AsyncResult
. Yeterince adil, ancak aynı zamanda AsyncResult
başarılı bir şekilde yürütülen ancak Kerevizin unutulmuş bir görevi de dikkate alacak birPENDING
etkiye sahiptir . Yine, bazı kullanım durumu senaryolarında bu bir sorun olabilir. Sorunun bir kısmı, Celery'in görevlerin sonuçlarını koruyacak şekilde nasıl yapılandırıldığına bağlıdır, çünkü bu, sonuçların arka ucundaki "mezar taşları" nın kullanılabilirliğine bağlıdır. ( "Mezar taşı" kayıt görevi nasıl bittiğini veri parçaları için Kereviz belgelerinde süreli kullanımıdır.) Kullanılması AsyncResult
durumunda hiç olmaz işi task_ignore_result
olduğunu True
. Daha can sıkıcı bir sorun da, Kerevizin varsayılan olarak mezar taşlarının süresinin dolmasıdır. result_expires
ayarı varsayılan olarak 24 saate ayarlanmıştır. Bu nedenle, bir görevi başlatırsanız ve kimliği uzun vadeli depolamaya kaydederseniz ve 24 saat sonra onunla bir oluşturursanız AsyncResult
, durum olacaktır PENDING
.
Tüm "gerçek görevler" PENDING
eyalette başlar. Bu nedenle PENDING
, bir göreve başlamak, görevin istendiği ancak hiçbir zaman bundan daha ileriye gitmediği anlamına gelebilir (herhangi bir nedenle). Ya da görevin çalıştığı anlamına gelebilir ama Kereviz durumunu unuttu.
Ah! AsyncResult
benim için çalışmayacak. Başka ne yapabilirim?
Görevleri takip etmektense hedefleri takip etmeyi tercih ederim . Bazı görev bilgilerini saklıyorum ama bu, hedefleri takip etmekten gerçekten ikincil. Hedefler, Kereviz'den bağımsız olarak depoda saklanır. Bir talebin bir hesaplama gerçekleştirmesi gerektiğinde, ulaşılmış bir hedefe bağlı olduğunda, hedefe zaten ulaşılıp ulaşılmadığını kontrol eder, eğer öyleyse, bu önbelleğe alınmış hedefi kullanır, aksi takdirde hedefi etkileyecek görevi başlatır ve HTTP isteğini yapan istemci, bir sonuç için beklemesi gerektiğini belirten bir yanıt.
Yukarıdaki değişken isimleri ve köprüler Celery 4.x içindir. 3.x olarak karşılık gelen değişken ve köprüler şunlardır: CELERY_TRACK_STARTED
, CELERY_IGNORE_RESULT
, CELERY_TASK_RESULT_EXPIRES
.
x
?