Canvas 芹菜:如何在任务之间组织复杂的数据流?

Canvas 芹菜:如何在任务之间组织复杂的数据流?,canvas,celery,Canvas,Celery,有没有办法控制传递给芹菜链中下一个任务的参数?例如,我有两个任务,它们都存在于最终结果中,第二个任务使用第一个任务结果数据的一部分来完成它的工作。下面是一些示例说明代码: 进口芹菜 随机输入 工人=芹菜。芹菜() @工人任务 def first(): 返回( random.randint(1,9),#第二次调用的参数 #只是一堆我想在结果中看到的数据 #但第二次呼叫不需要 [random.randint(1,9)表示x范围内的uu(100)] ) @工人任务 def秒(数字): 返回[rando

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

进口芹菜
随机输入
工人=芹菜。芹菜()
@工人任务
def first():
返回(
random.randint(1,9),#第二次调用的参数
#只是一堆我想在结果中看到的数据
#但第二次呼叫不需要
[random.randint(1,9)表示x范围内的uu(100)]
)
@工人任务
def秒(数字):
返回[random.randint(1,9)for uux范围内(数字)]
第二次调用取决于第一次调用,所以它必须是一个链。但我希望最终结果也包括第一个任务的数据,而不通过第二个任务绕过它。最简单的方法是:

参数,partial1=first.s().apply\u async().get()
partial2=second.s(参数).apply_async().get()
结果=(第1部分,第2部分)
但这是错误的方式。如何做好这件事?

你可以这样做

(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)]

我很好奇你想要完成什么,我相信你可能试图从错误的角度来理解这一点。我同意我的合成例子太简单了。我试图避免将大量未使用的数据传输到整个链中,并在任何步骤将其交给某种累加器。或者找到另一种更干净的解决方案。你是否考虑过将数据存储在redis之类的后端服务中?我考虑过这个问题。这对我来说是个坏主意。实际方法中的第一个和第二个是另一组任务。通过一系列任务传递未使用的数据会带来很多开销,而且对于较长的链来说,这也不起作用(虽然会,但很难看)。