Celery:如何组织任务之间的复杂数据流?

时间:2014-11-13 08:43:32

标签: canvas celery

有没有办法控制传递给芹菜链中下一个任务的参数?例如,我有两个任务,它们都存在于最终结果中,第二个任务使用第一个任务结果数据的一部分来完成它的工作。下面的一些示例插图代码:

import celery
import random

worker = celery.Celery()

@worker.task
def first():
    return(
        random.randint(1,9), # argument for second call
        # just a bunch of data I want to see in results
        # but not needed for second call
        [random.randint(1,9) for _ in xrange(100)]
    )

@worker.task
def second(number):
    return [random.randint(1,9) for _ in xrange(number)]

第二次呼叫首先取决于它必须是一个链。但我希望最终结果包括第一个数据,而不是通过第二个任务绕过它。最简单的方法是:

argument, partial1 = first.s().apply_async().get()
partial2 = second.s(argument).apply_async().get()
results = (partial1, partial2)

但文档says这是错误的方式。怎么做对了?

1 个答案:

答案 0 :(得分:1)

你可以这样做

(partial1, partial2) = (first.s() | second.s(return_value_from_first))().get()

只需将第一个任务的输入传递给第二个任务。

import celery
import random

worker = celery.Celery()

@worker.task
def first():
    return(random.randint(1,9), [random.randint(1,9) for _ in xrange(100)])

@worker.task
def second(return_value_from_first):
    number, partial1 = return_value_from_first
    return [partial1, random.randint(1,9) for _ in xrange(number)]