celery中 @app.task与@shared_task 的区别
1 两个装饰器的区别
-
@app.task(bind=True)
装饰器:- 这是Celery库中的装饰器,用于将函数注册为Celery任务。
bind=True
指定任务函数的第一个参数为任务实例本身(通常命名为self),允许您在任务函数内部访问任务实例的属性和方法。
-
@shared_task(base=MyHookTask, bind=True)
装饰器:- 这是Celery的另一个装饰器,用于将函数注册为共享任务(shared task)。
- 共享任务是一种特殊类型的任务,可以跨多个Celery应用程序共享和调用。
- 如果您的任务需要在多个Celery应用程序中共享,或者您希望使用共享任务的特性,那么可以考虑使用此装饰器。
2 使用建议
哪个装饰器更好取决于您的具体需求和使用情况:
如果您只是在单个Celery应用程序中定义和使用任务函数,那么@app.task(bind=True)
装饰器可能更适合。
如果您需要共享任务或跨多个Celery应用程序使用任务,那么@shared_task(bind=True)
装饰器可能更适合。
解释1) 当我们使用@app.task装饰器定义我们的异步任务时,那么这个任务依赖于根据项目名myproject生成的Celery实例
app = Celery('myproject') @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request))
解释2) 然而我们在进行Django开发时为了保证每个app的可重用性,我们经常会在每个app文件夹下编写异步任务,这些任务并不依赖于具体的Django项目名。使用@shared_task 装饰器能让我们避免对某个项目名对应Celery实例的依赖,使app的可移植性更强
from __future__ import absolute_import from celery import shared_task @shared_task def add(x, y): return x + y