我在用芹菜,我有几个任务需要按顺序执行。
例如,我有这个任务:
@celery.task
def tprint(word):
print word
我想这样做:
>>> chain(tprint.s('a') | tprint.s('b'))()
然后我得到TypeError: tprint() takes exactly 1 argument (2 given)
。
和chord一样,在这种情况下,我需要在一组任务之后执行一个任务:
>>> chord([tprint.s('a'), tprint.s('b')])(tprint.s('c'))
那么如何应对这种情况呢?我不在乎每个任务的结果,但它们需要按顺序执行。
添加第二个参数将不起作用:
@celery.task
def tprint(word, ignore=None):
print word
>>> chain(tprint.s('a', 0) | tprint.s('b'))()
这将打印“a”和“无”。
你可以试试这样做。 您可以有两个参数,而不是函数tprint的单个参数
那么
一个可能的解决方案已经发布,但我想补充进一步的澄清和一个替代的解决方案(在某些情况下,一个更好的)。
您看到的错误表明您的任务的签名需要考虑第二个参数,这是因为当在
chain
中调用任务时,芹菜会自动将每个任务result
作为以下任务的第一个参数。从docs:
因此,在您的情况下,您可以这样重写您的任务:
如果您不打算对结果做任何处理,您也可以忽略它,方法是changing the decorator thus:然后就不必更改任务签名了。
对不起,最后一点需要进一步研究。
有一个内置的功能可以忽略链接结果和其他不可变的子任务。可以使用.si()快捷方式而不是.s()或.subtask(不可变=真)
这里有更多细节:http://docs.celeryproject.org/en/master/userguide/canvas.html#immutability
相关问题 更多 >
编程相关推荐