只使用 `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.
背景故事
在 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.