celery中 @app.task与@shared_task 的区别

1 两个装饰器的区别

  1. @app.task(bind=True)装饰器:

    • 这是Celery库中的装饰器,用于将函数注册为Celery任务
    • bind=True指定任务函数的第一个参数为任务实例本身(通常命名为self),允许您在任务函数内部访问任务实例的属性和方法。
  2. @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

 

 

 

posted @ 2024-01-10 22:30  tslam  阅读(912)  评论(0编辑  收藏  举报