【问题标题】:Is it wrong to just use `T.s([args])` to just call Celery tasks?只使用 `T.s([args])` 来调用 Celery 任务是错误的吗?
【发布时间】:2017-06-14 16:16:47
【问题描述】:

背景故事

在 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()(签名),因为我可以以类似于函数的方式传入参数并且只需将调用附加到apply_async()

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

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

...纯粹是为了美观。

问题

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

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

【问题讨论】:

    标签: python celery django-celery celery-task


    【解决方案1】:

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

    在这种情况下您应该小心。如果您在具有不正确参数的链中使用部分,则上一个任务将其结果发送到部分,这可能不是您想要的。在这种情况下,您可以使用immutable signatures

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 2016-03-31
      • 1970-01-01
      • 2018-05-03
      • 2011-09-27
      相关资源
      最近更新 更多