Задача с bind=True
У меня есть задача сельдерея, которая выполняет вычисление, длящееся несколько секунд.
from celery import states
@celery.task(name="crunch.task", bind=True)
def crunch(self, data):
try:
pass
# ... run computation with data here
except Exception as exc:
self.update_state(
state=states.FAILURE,
meta={"details": "error details here"}
)
raise exc
Важной особенностью здесь является то, что я использую bind=True
, который передает задачу в функцию как параметр self
. Это позволяет получить доступ к методу update_state
задачи, который отлично подходит для обработки ошибок.
Групповая работа
Теперь я хочу запустить эту задачу в пакетном задании, используя celery.group
.
@celery.task(name="batch.task", bind=True)
def batch(self, data_list):
try:
# HERE! IT SEEM WRONG TO PASS `SELF` INTO THE CHILD TASKS
job = group([crunch(self, data) for data in data_list]) # <-- here `self` should be created by celery!
job.async_apply()
except Exception as exc:
self.update_state(
state=states.FAILURE,
meta={"details": "error details here"}
)
raise exc
Как составить celery.group
из задач с bind=True
?