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

标签 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'})

他们继续解释:

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 .

关于python - 仅使用 `T.s([args])` 来调用 Celery 任务是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44549907/

相关文章:

Python Celery 任务在没有后端的情况下完成

python - 多服务器生产环境中的django-celery

python - 断言失败时继续 Python 的单元测试

python - 无法在 pythonanywhere 中安装自定义 python 模块

python : Manipulating Arguments from a list of objects.

django - 在 Celery 中为长时间运行的任务实现 "idle"和 "normal"优先级队列

python - Celery:访问链中的所有先前结果

python - 关闭 Celery 任务

python - 重启 celery 会导致重复任务吗?

python - SqlAlchemy - 按定义为 ForeignKey 的字段过滤