Skip to content

Вызов тасок в Celery

Асинхронный запуск

@shared_task
def task(*args, **kwargs):
    ...


task.delay(*args, **kwargs)
task.apply_async(args, kwargs)

Источник

Цепочка тасок

Чтобы сделать цепочку тасок, нужно сделать signature:

from celery import signature

signature('tasks.add', args=(2, 2), countdown=10)
add.signature((2, 2), countdown=10)
add.s(2, 2).set(countdown=10)

s - это типа partial, т.е. если таска принимает 2 аргумента, можно сделать partial с 1 аргом, и затем зачейнить:

# mul принимает 2 аргумента, но используя {s} можно 1 арг указать
add.apply_async((2, 2), link=mul.s(16))() 
(2 + 2) * 16 

Можно чейнить и без передачи арга из результата предыдущей функции, используя si:

(add.si(2, 2) | add.si(4, 4) | add.s(8, 8))().get()
16
(2+2) | (4+4) | (8+8) # вернется результат последней таски

Делаем цепочку:

add.apply_async((2, 2), link=mul.s(16))
add.s(2, 2) | mul.s(16)

Источник