有没有办法控制传递给芹菜链中下一个任务的参数?例如,我有两个任务,它们都存在于最终结果中,第二个任务使用第一个任务结果数据的一部分来完成它的工作。下面的一些示例插图代码:
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这是错误的方式。怎么做对了?
答案 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)]