使用`T.s([args])`来调用Celery任务是不对的?

时间:2017-06-14 16:16:47

标签: python celery django-celery celery-task

背景故事

在Celery文档的第一部分中,对于"Calling Tasks",他们使用delay()apply_async()进行了描述,例如:

task.delay(arg1, arg2, kwarg1='x', kwarg2='y')

task.apply_async(args=[arg1, arg2], kwargs={'kwarg1': 'x', 'kwarg2': 'y'})

他们继续解释:

  

所以延迟显然很方便,但如果你想设置额外的执行选项,你必须使用apply_async。

我想要额外的选项,但将args / kwargs传递给apply_async()看起来很难看。

相反,我刚刚使用Task.s()(签名),因为我可以以类似函数的方式传入args,只需将调用追加到{{ 1}}。

要解释一下,这就是我创建它们的大部分任务:

apply_async()

......纯粹是为了美学。

问题

我是否忽略了以这种方式调用我的任务的一些缺点?

基于我阅读Celery Canvas docs,我知道我没有使用签名来发挥其潜力。但是,我做了一些错误的,这可能会在以后咬我?

1 个答案:

答案 0 :(得分:1)

使用签名或部分调用任务没有问题。但是,在某些情况下,您可能会将某些参数传递给partial,然后在稍后传递其余参数。

在这种情况下你应该小心。如果在链中使用带有错误args的partial,则上一个任务会将其结果发送到partial,而这可能不是您想要的。在这种情况下,您可以使用immutable signatures