连锁芹菜任务并隐含地从一个任务返回到另一个任务

时间:2014-11-18 15:54:36

标签: python celery

我正在尝试执行以下操作

@shared_task
def task1():
    return '1'

@shared_task
def task2(r1):
    return '2'

@shared_task
def task3(r2):
    return 'done'

@shared_task
def job():
    chain = (task1.s() | task2.s() | task3.s() ).apply_async()
    chain()

但是我必须明确地给出task2task3参数,否则我会得到错误。

如何让结果流向下一个任务?

2 个答案:

答案 0 :(得分:2)

您可以直接将其他参数传递给子任务而无需更改任何内容。

chain = (task1.s() | task2.s(r1) | task3.s(r2) ).apply_async()

这里task1不接受任何参数,task2接受两个参数,第一个是前一个任务的结果,第二个是r1。对于task3也是如此。

如果在task2中不需要task1的结果,那么可以将task2的签名设置为不可变。

chain = (task1.s() | task2.si(r1) | task3.s(r2) ).apply_async()

这里task1不接受任何参数,task2只接受一个参数r1。 Task3接受两个参数,第一个是前一个任务的结果,第二个是r2

答案 1 :(得分:1)

您需要稍微更改作业部分:

@shared_task
def job():
    chain = (task1.s() | task2.s() | task3.s() )
    result = chain().get()
    return result

由于执行一个任务取决于它的前一个任务,你不能通过异步应用它来获得任何东西。但是,您可以异步启动作业。

这不是一个好习惯你和should be avoided