在 Celery 中,@app.task
和@shared_task
都是用于定义任务的装饰器,但它们在使用和上下文上有所不同。其中@shared_task
是在Django项目中被应用,因此只能和Django框架或基于此框架的项目兼容。而@app.task
则与celery完全兼容。其中主要区别如下。
1.上下文
@app.task
:此装饰器直接绑定到特定的 Celery 应用实例(app)。它明确指定了任务与哪个 Celery 应用相关联。用于将函数注册成Celery 任务@shared_task
:这个装饰器是 Django-Celery 提供的,它允许你在 Django 项目中定义可以在多个地方(如多个 Django 应用)共享的任务(shared task)。它会自动从 Django 的设置(settings.py)中获取 Celery 应用实例,所以你不需要在每个任务定义中都明确指定它。
2.使用场景
- 不是在 Django 项目中使用 Celery,或者你的任务不需要在多个 Django 应用之间共享,那么使用
@app.task
是更加合适的。 - 如果你在 Django 项目中使用 Celery,并且希望你的任务可以在多个 Django 应用之间共享,那么使用
@shared_task
会更加方便。
3.详细说明
- 使用
@app.task
时,你需要先创建一个 Celery 应用实例,并将其作为装饰器的参数。如果是@app.task(bind=True)
则是指定任务函数第一个参数为任务实例本身,通常命名为self,可以在任务函数内部访问任务实例的属性方法。
from celery import Celery
app = Celery('my_project')
@app.task
def add(x, y):
return x + y
- 使用
@shared_task
时,你不需要显式地传递 Celery 应用实例,因为 Django-Celery 会自动为你处理。使用时因为共享任务是一种特殊类型的任务,可以跨多个Celery 应用程序共享和调用。并且通常情况下会将异步任务编写在每个app文件夹下,是的移植性更强。
from celery import shared_task
@shared_task
def add(x1, y1):
return x1 + y1
4.配置说明
- 使用
@app.task
时,你需要确保 Celery 应用实例被正确配置,包括 broker URL、backend URL 等。 - 使用
@shared_task
时,这些配置通常会在 Django 的 settings.py 文件中设置,Django-Celery 会自动读取这些设置。