Celery: Dapatkan id tugas seledri sebelum memanggil `delay`

Dibuat pada 22 Jan 2014  ·  3Komentar  ·  Sumber: celery/celery

Dalam aplikasi saya, saya menggunakan tabel untuk melacak dan menyimpan informasi tambahan dari tugas yang diluncurkan (sebut saja tabel tugas aplikasi). Dalam beberapa kasus, saya memerlukan ID dari catatan tugas aplikasi yang dibuat dalam tugas seledri yang sebenarnya. Masalahnya adalah catatan tugas aplikasi ini hanya dibuat setelah tugas diluncurkan (karena id tugas seledri adalah bagian dari catatan ID tugas aplikasi) dan akan sulit untuk meneruskan ID tugas ke tugas yang sedang berjalan.

Intinya, saya memerlukan id tugas seledri untuk membuat catatan tugas aplikasi, dan saya memerlukan id tugas aplikasi untuk membuat tugas seledri.

Apakah ada cara yang kuat untuk menyelesaikan masalah ayam dan telur ini? Salah satu cara yang dapat saya pikirkan adalah menghentikan eksekusi entah bagaimana sampai saya membuat catatan tugas aplikasi (dalam pemanggil task_function.delay() ), tetapi saya tidak dapat memikirkan cara untuk melakukan ini dengan seledri di luar kotak atau cara meneruskan id tugas aplikasi ke tugas.

Adakah pemikiran, petunjuk, petunjuk tentang itu? - Terima kasih banyak!

Komentar yang paling membantu

Anda dapat menyelesaikan objek tanda tangan dengan membekukannya:

>>> sig = add.s(2, 2)
>>> sig.freeze()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>
>>> sig.delay()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>

>>> sig = group(add.s(i, i) for i in range(5))
>>> sig.freeze()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>
>>> sig.delay()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>

Anda dapat menentukan id untuk tugas apa pun:

 >>> from celery import uuid
 >>> task_id = uuid()
 >>> task_id
'c7f388e9-d688-4f1d-be22-fb043b93c725'
 >>> add.apply_async((2, 2), task_id=task_id)
 <AsyncResult: c7f388e9-d688-4f1d-be22-fb043b93c725>

Untuk melakukan sesuatu saat tugas dipanggil, Anda dapat menggunakan before_task_publish or
after_task_publish sinyal (lihat Sinyal Dasar )

Semua 3 komentar

Anda dapat menyelesaikan objek tanda tangan dengan membekukannya:

>>> sig = add.s(2, 2)
>>> sig.freeze()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>
>>> sig.delay()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>

>>> sig = group(add.s(i, i) for i in range(5))
>>> sig.freeze()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>
>>> sig.delay()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>

Anda dapat menentukan id untuk tugas apa pun:

 >>> from celery import uuid
 >>> task_id = uuid()
 >>> task_id
'c7f388e9-d688-4f1d-be22-fb043b93c725'
 >>> add.apply_async((2, 2), task_id=task_id)
 <AsyncResult: c7f388e9-d688-4f1d-be22-fb043b93c725>

Untuk melakukan sesuatu saat tugas dipanggil, Anda dapat menggunakan before_task_publish or
after_task_publish sinyal (lihat Sinyal Dasar )

Terima kasih banyak. Saya menggunakan opsi task_id = uuid() . Ini bekerja seperti pesona!

Saya tahu ini sudah tua, tapi itu luar biasa untuk melihat bahwa saya bukan satu-satunya dengan kasus penggunaan seperti ini - dan juga luar biasa untuk melihat bahwa Celery mendukung beberapa solusi (baik). Desain perpustakaan yang bagus.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat