Membuat AsyncResult
objek dari id tugas adalah cara yang direkomendasikan di FAQ untuk mendapatkan status tugas ketika satu-satunya yang Anda miliki adalah id tugas.
Namun, pada Seledri 3.x, ada peringatan signifikan yang dapat menggigit orang jika mereka tidak memperhatikannya. Itu benar-benar tergantung pada skenario kasus penggunaan tertentu.
Secara default, Celery tidak merekam status "berjalan".
Agar Celery dapat merekam bahwa tugas sedang berjalan, Anda harus mengatur task_track_started
ke True
. Berikut adalah tugas sederhana yang menguji ini:
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
When task_track_started
is False
, yang merupakan default, status menunjukkan PENDING
meskipun tugas telah dimulai. Jika Anda disetel task_track_started
ke True
, statusnya akan menjadi STARTED
.
Negara PENDING
berarti "Saya tidak tahu."
Sebuah AsyncResult
dengan negara PENDING
tidak berarti lebih dari itu Celery tidak tahu status tugasnya. Ini bisa jadi karena sejumlah alasan.
Untuk satu hal, AsyncResult
dapat dibangun dengan id tugas yang tidak valid. "Tugas" seperti itu akan dianggap tertunda oleh Celery:
>>> task.AsyncResult("invalid").status
'PENDING'
Oke, jadi tidak ada yang akan memberikan id yang jelas tidak valid AsyncResult
. Cukup adil, tetapi juga memiliki efek yang AsyncResult
juga akan mempertimbangkan tugas yang telah berhasil dijalankan tetapi Celery telah dilupakan PENDING
. Sekali lagi, dalam beberapa skenario kasus penggunaan, ini bisa menjadi masalah. Sebagian dari masalah bergantung pada bagaimana Celery dikonfigurasi untuk menyimpan hasil tugas, karena bergantung pada ketersediaan "batu nisan" di backend hasil. ( "Batu nisan" adalah penggunaan istilah dalam dokumentasi Seledri untuk potongan data yang merekam bagaimana tugas berakhir.) Menggunakan AsyncResult
tidak akan bekerja sama sekali jika task_ignore_result
ini True
. Masalah yang lebih menjengkelkan adalah Celery secara default membuat batu nisan mati. Ituresult_expires
pengaturan secara default diatur ke 24 jam. Jadi jika Anda meluncurkan tugas, dan merekam id dalam penyimpanan jangka panjang, dan lebih dari 24 jam kemudian, Anda membuat AsyncResult
dengan itu, statusnya akan menjadi PENDING
.
Semua "tugas nyata" dimulai di PENDING
negara bagian. Jadi mendapatkan PENDING
tugas bisa berarti bahwa tugas tersebut diminta tetapi tidak pernah berkembang lebih jauh dari ini (untuk alasan apa pun). Atau bisa juga berarti tugasnya berjalan tetapi Celery lupa keadaannya.
Aduh! AsyncResult
tidak akan berhasil untuk saya. Apa lagi yang bisa saya lakukan?
Saya lebih suka melacak tujuan daripada melacak tugas itu sendiri . Saya menyimpan beberapa informasi tugas tetapi itu benar-benar sekunder untuk melacak tujuan. Sasaran disimpan dalam penyimpanan terpisah dari Seledri. Ketika sebuah permintaan perlu melakukan penghitungan tergantung pada beberapa tujuan yang telah dicapai, ia memeriksa apakah tujuan telah tercapai, jika ya, maka ia menggunakan tujuan yang di-cache ini, jika tidak ia memulai tugas yang akan mempengaruhi tujuan, dan mengirim ke klien yang membuat permintaan HTTP respon yang menunjukkan itu harus menunggu hasil.
Nama variabel dan hyperlink di atas adalah untuk Celery 4.x. Dalam 3.x yang sesuai variabel dan hyperlink adalah: CELERY_TRACK_STARTED
, CELERY_IGNORE_RESULT
, CELERY_TASK_RESULT_EXPIRES
.
x
?