Saya telah membaca dokumen dan mencari tetapi tidak dapat menemukan jawaban langsung:
Bisakah Anda membatalkan tugas yang sudah dijalankan? (seperti dalam tugas telah dimulai, membutuhkan beberapa saat, dan setengah jalan perlu dibatalkan)
Saya menemukan ini dari dokumen di FAQ Celery
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
Tapi saya tidak jelas apakah ini akan membatalkan tugas antrian atau jika itu akan mematikan proses yang sedang berjalan pada seorang pekerja. Terima kasih atas cahaya apa pun yang bisa Anda tumpahkan!
sumber
Di Celery 3.1, API tugas pencabutan diubah.
Menurut FAQ Seledri , Anda harus menggunakan result.revoke:
>>> result = add.apply_async(args=[2, 2], countdown=120) >>> result.revoke()
atau jika Anda hanya memiliki id tugas:
>>> from proj.celery import app >>> app.control.revoke(task_id)
sumber
Jawaban @ 0x00mh benar, namun dokumen seledri baru-baru ini mengatakan bahwa menggunakan
terminate
opsi ini adalah " pilihan terakhir untuk administrator " karena Anda mungkin secara tidak sengaja menghentikan tugas lain yang mulai dijalankan sementara itu. Mungkin solusi yang lebih baik adalah menggabungkanterminate=True
dengansignal='SIGUSR1'
(yang menyebabkan pengecualian SoftTimeLimitExceeded dimunculkan dalam tugas).sumber
SoftTimeLimitExceeded
dimunculkan dalam tugas saya, logika pembersihan kustom saya (diimplementasikan melaluitry
/except
/finally
) dipanggil. Ini jauh lebih baik, menurut saya, daripada apa yangAbortableTask
ditawarkan ( docs.celeryproject.org/en/latest/reference/… ). Dengan yang terakhir, Anda memerlukan backend hasil database dan Anda harus secara manual dan berulang kali memeriksa status tugas yang sedang berjalan untuk melihat apakah itu telah dibatalkan.worker_prefetch_multiplier = 1
karena saya hanya memiliki beberapa tugas yang berjalan lama, penghentian seharusnya baik-baik saja - karena tidak ada tugas lain yang akan dilakukan dengan penghentian - apakah saya mendapatkan ini dengan benar? @spicyramenLihat opsi berikut untuk tugas: time_limit , soft_time_limit (atau Anda dapat mengaturnya untuk pekerja). Jika Anda ingin mengontrol tidak hanya waktu eksekusi, lihat argumen kedaluwarsa metode apply_async.
sumber
Selain itu, kurang memuaskan, ada cara lain (batalkan tugas) untuk menghentikan tugas, namun masih banyak yang tidak dapat diandalkan, lebih jelasnya lihat: http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable .html
sumber