跳到主要内容

Celery中装饰器 @app.task 和 @shared_task的区别?

参考答案:

在Celery中,@app.task@shared_task都是用于定义任务的装饰器,但它们在用途和特性上有一些区别。

@app.task

@app.task是一个直接和特定的Celery应用实例相关联的装饰器。当你使用这个装饰器来定义一个任务时,你需要明确地指定它属于哪个Celery应用实例。例如:

from celery import Celery

app = Celery('myapp')

@app.task
def add(x, y):
    return x + y

在这个例子中,add任务是直接和app这个Celery实例相关联的。如果你有多个Celery实例,并且每个实例都定义了相同的任务,那么这些任务将被视为不同的任务,因为它们属于不同的应用实例。

@shared_task

@shared_task是一个特殊的装饰器,它使得任务可以在多个Celery应用实例之间共享。当你使用@shared_task来定义一个任务时,这个任务会被注册到Celery的全局任务注册表中,因此它可以被任何知道这个任务名称的Celery应用实例调用。例如:

from celery import shared_task

@shared_task
def add(x, y):
    return x + y

在这个例子中,add任务被注册到了全局任务注册表中,所以任何知道这个任务名称的Celery应用实例都可以调用它。这意味着如果你有多个Celery实例,并且它们都引用了相同的代码文件(其中定义了@shared_task装饰的任务),那么这些实例将共享同一个任务定义。

总结

  • @app.task:定义一个直接和特定Celery应用实例相关联的任务。
  • @shared_task:定义一个可以在多个Celery应用实例之间共享的任务。

选择使用哪个装饰器取决于你的需求。如果你希望任务只在特定的Celery应用实例中运行,那么可以使用@app.task。如果你希望任务可以在多个Celery应用实例之间共享,那么可以使用@shared_task