我的情况与此处概述的情况类似,除了我不想用多个参数链接任务,而是想链接返回具有多个条目的字典的任务。
这是 - 非常松散和抽象地 - 我正在尝试做的事情:
任务.py
@task()
def task1(item1=None, item2=None):
item3 = #do some stuff with item1 and item2 to yield item3
return_object = dict(item1=item1, item2=item2, item3=item3)
return return_object
def task2(item1=None, item2=None, item3=None):
item4 = #do something with item1, item2, item3 to yield item4
return_object = dict(item1=item1, item2=item2, item3=item3, item4=item4)
return return_object
从 ipython 工作,我能够单独和异步调用 task1,没有问题。
我也可以单独调用 task2,并将 task1 返回的结果作为双星参数:
>>res1 = task1.s(item1=something, item2=something_else).apply_async()
>>res1.status
'SUCCESS'
>>res2 = task2.s(**res1.result).apply_async()
>>res2.status
'SUCCESS
但是,我最终想要实现的是与上面相同的最终结果,但是通过一个链,在这里,我无法弄清楚如何实例化 task2,而不是使用 task1 返回的(位置)参数,而是使用 task1.result 作为**kwargs:
chain_result = (task1.s(item1=something, item2=something_else) | task2.s()).apply_async() #THIS DOESN'T WORK!
我怀疑我可以回去重写我的任务,以便它们返回位置参数而不是字典,这可能会解决问题,但在我看来,应该有某种方法可以访问 task1 在 task2 中的返回对象**双星的功能。我还怀疑我在这里遗漏了一些关于 Celery 子任务实现或 *args 与 **kwargs 的相当明显的东西。
希望这是有道理的。并提前感谢任何提示。