Как сделать группу из задач с bind=True?

Задача с 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?


person Daniel Farrell    schedule 25.01.2021    source источник


Ответы (1)


Вам нужно работать с подписями,

crunch.si(data)
person Daniel Farrell    schedule 26.01.2021