只使用 `T.s([args])` 来调用 Celery 任务是错误的吗?

Is it wrong to just use `T.s([args])` to just call Celery tasks?

背景故事

在 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'})

他们继续解释:

So delay is clearly convenient, but if you want to set additional execution options you have to use apply_async.

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

相反,我一直在使用 Task.s()(签名),因为我可以以一种读起来像函数的方式传递参数 只是追加对 apply_async() 的调用。

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

task_id = cool_task.s(arg1, arg2).apply_async()

...纯粹为了美观。

问题

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

根据我对 Celery Canvas docs 的阅读,我知道我没有使用签名来发挥它们的潜力。但是我是不是在做一些错误的事情,以后可能会咬我?

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

在这种情况下你应该小心。如果您在带有不正确参数的链中使用部分,则先前的任务会将其结果发送给部分,而这可能不是您想要的。在这种情况下,您可以使用 immutable signatures.