Celery apply_async将kwargs传递给链中的所有任务

时间:2019-11-26 04:09:36

标签: python celery celery-task

示例任务:

@app.task()
def add(**kwargs):
    time.sleep(5)
    x, y = kwargs['add'][0], kwargs['add'][1]
    return x + y

@app.task()
def sub(**kwargs):
    time.sleep(5)
    x = args[0]
    y = kwargs['sub'][0], kwargs['sub'][0]
    return x - y

示例任务数据= kwargs = {'add' : (2, 2), 'sub' : (3)}
链接任务:result = (add.s() | sub.s()).apply_async(kwargs = kwargs)

As per design,apply_async仅将kwargs应用于链中的第一个任务。我需要进行哪些更改才能实现所需的结果?

2 个答案:

答案 0 :(得分:0)

为什么在链接任务之前不只是部分绑定任务?

result = (add.s(add=(2,2)) | sub.s(sub=(3,3))).apply_async()

答案 1 :(得分:0)

因此,从Celery v4.4.0rc4开始,除了将kwarg传递给每个任务的签名之外,没有其他更好的方法。虽然看起来确实像Ask Solem (Celery dev) is open to a feature request.

这是链的外观:

result = (add.s(job_data = job_data)| sub.s(job_data = job_data)).apply_async()

但是,由于我们的链条有10多个任务,因此我不得不想出一种更简单的方法来编写此代码。

# Workflow generator
def workflow_generator(task_list, job_data):
    _tasks = tuple(getattr(task, 's')(job_data = job_data) for task in task_list)
    return chain(*_tasks).apply_async()

taskList = [add, sub]
job_data = {'add' : (2, 2), 'sub' : (3)}
result = workflow_generator(taskList, job_data)