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

在 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 会自动读取这些设置。
Django_celery_beat是一个django应用程序,它允许您使用celery定期运行周期性任务。这些周期性任务可以是一次性的或循环的,你可以设置它们在指定的时间间隔内自动运行,也可以设置它们在特定的时间运行。 要使用django_celery_beat,请按照以下步骤操作: 1. 安装django_celery_beat: ``` pip install django_celery_beat ``` 2. 在settings.py中添加以下代码: ``` INSTALLED_APPS = [ # ... 'django_celery_beat', ] CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' ``` 3. 在项目的urls.py文件中添加以下代码: ``` from django.urls import path from django_celery_beat.views import ( PeriodicTaskListView, PeriodicTaskCreateView, PeriodicTaskUpdateView, PeriodicTaskDeleteView, PeriodicTaskDetailView, ) urlpatterns = [ # ... path('celery/periodic-tasks/', PeriodicTaskListView.as_view(), name='periodic_task_list'), path('celery/periodic-task/add/', PeriodicTaskCreateView.as_view(), name='periodic_task_create'), path('celery/periodic-task/<int:pk>/', PeriodicTaskDetailView.as_view(), name='periodic_task_detail'), path('celery/periodic-task/<int:pk>/update/', PeriodicTaskUpdateView.as_view(), name='periodic_task_update'), path('celery/periodic-task/<int:pk>/delete/', PeriodicTaskDeleteView.as_view(), name='periodic_task_delete'), ] ``` 4.celery.py文件中添加以下代码: ``` from celery import Celery from django.conf import settings app = Celery('my_project') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) ``` 5.tasks.py文件中创建您的任务,例如: ``` from celery import shared_task @shared_task def my_task(): # Do something here ``` 6. 创建周期性任务,您可以使用Django admin或创建它们的视图。 现在,您已经可以在django中使用celery定期运行周期性任务了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无聊的邓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值