芹菜:如何在和弦或链子中忽略任务结果?

2024-05-12 18:31:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用芹菜,我有几个任务需要按顺序执行。

例如,我有这个任务:

@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”和“无”。


Tags: chaintask顺序def情况argumentwordcelery
3条回答

你可以试试这样做。 您可以有两个参数,而不是函数tprint的单个参数

def tprint(word, x=None):
    print word

那么

chain(tprint.s('a', 0) | tprint.s('b'))()

一个可能的解决方案已经发布,但我想补充进一步的澄清和一个替代的解决方案(在某些情况下,一个更好的)。

您看到的错误表明您的任务的签名需要考虑第二个参数,这是因为当在chain中调用任务时,芹菜会自动将每个任务result作为以下任务的第一个参数。

docs:

Tasks can be linked together, which in practice means adding a callback task:

>>> res = add.apply_async((2, 2), link=mul.s(16))
>>> res.get()
4

The linked task will be applied with the result of its parent task as the first argument

因此,在您的情况下,您可以这样重写您的任务:

@celery.task
def tprint(result, word):
    print word

如果您不打算对结果做任何处理,您也可以忽略它,方法是changing the decorator thus

@celery.task(ignore_result=True)

然后就不必更改任务签名了。

对不起,最后一点需要进一步研究。

有一个内置的功能可以忽略链接结果和其他不可变的子任务。可以使用.si()快捷方式而不是.s()或.subtask(不可变=真)

这里有更多细节:http://docs.celeryproject.org/en/master/userguide/canvas.html#immutability

相关问题 更多 >