创建芹菜任务的不同方法之间的区别

Posted

技术标签:

【中文标题】创建芹菜任务的不同方法之间的区别【英文标题】:Difference between different ways to create celery task 【发布时间】:2019-06-27 15:00:34 【问题描述】:

查看创建 celery 任务的不同方法时,我感到非常困惑。从表面上看,它们的工作原理都是一样的,所以,谁能解释一下它们之间的区别。

1.

from myproject.tasks import app

@app.task
def foo():
    pass

2.

from celery import task

@task
def foo():
    pass

3.

from celery import shared_task

@shared_task
def foo():
    pass

我通过谷歌搜索知道第一个和第三个之间的区别是shared_task,当您没有具体的应用程序实例时使用。有人可以详细说明一下,什么时候使用第二个?

【问题讨论】:

我对 #1 感到困惑,你在项目的哪个位置写这个?如果关注docs.celeryproject.org/en/stable/django/…,这也可以是from proj.celery import app 【参考方案1】:

除非您使用的是 celery v3,否则不要使用 #2。如果您使用的是 celery v4,请使用 #1。

在编写可重用库或 django 应用程序的情况下使用 #3。例如,如果您正在编写一组允许您使用 celery 管理 aws ec2 实例的开源任务,您将使用 shared_task 以便任务可以在 celery 上运行,但您会将其留给使用您的人为自己配置 celery 的库。

如果您是为自己的项目编写并且不担心重复使用,请使用 #1。

【讨论】:

第二种方法仅适用于 celery v3 吗?如果我们在 v4 中使用呢?还有1号和2号有区别吗?除了特定于 celery 版本之外,它们是否完全相同? 据我了解,是的,第二个版本只针对v3,不应该与v4一起使用。 #1 和 #2 之间存在差异,但这是因为 v4 与 v3 根本不同。在 v4 中,使用装饰器本质上将任务注册为可运行的任何从该应用程序实例启动的工作人员。我认为 v3 中没有类似的概念。 我们使用#2 方法在使用 Celery 4.3.0 的 Django 1.11 应用程序中声明所有任务,一切似乎都按预期工作。即使是最新的 Celery 文档似乎也可以互换使用它 docs.celeryproject.org/en/v5.0.5/userguide/tasks.html。您是否有任何关于弃用或功能更改的具体消息来源? @tmarice #2 似乎不再出现在文档中。 task 也不能从 celery 5.1.1 导入

以上是关于创建芹菜任务的不同方法之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

为啥创建了芹菜任务但未收到

重置芹菜任务的倒计时

来自异步芹菜工作者的 SocketIO 发出不工作

如何取消芹菜队列上的任务? [复制]

芹菜:启动时启动任务

在任务中获取芹菜节拍触发时间