0


Django中celery的使用

一、celery的使用

celery架构图(核心):

在这里插入图片描述

1.1 使用场景及安装

  1. 使用celery,主要有以下几种情况
  2. - 定时任务
  3. - 延迟任务
  4. - 异步任务
  5. 使用命令安装
  6. pip install celery

官方使用django-celery的文档:
https://docs.celeryq.dev/en/main/django/first-steps-with-django.html#using-celery-with-django

1.2在项目路径下创建celery.py

  1. import os
  2. from celery import Celery
  3. # 1 导入django的配置文件(可以在WSGI中找到)---》后续在celery的任务中,就可以直接使用django的orm,缓存
  4. os.environ.setdefault('DJANGO_SETTINGS_MODULE','TB_test.settings')# 2 实例化得到celery对象
  5. app = Celery('myproj')# 3 celery的配置,使用django 配置文件中的配置--》刚刚写的配置
  6. app.config_from_object('django.conf:settings')# 4 这句话会去所有app中,自动查找 tasks.py 文件,作为任务文件
  7. app.autodiscover_tasks()

在这里插入图片描述

1.3 django的配置文件settings.py

  1. ############# celery的配置信息#######1 Broker配置,使用Redis作为消息中间件
  2. BROKER_URL ='redis://127.0.0.1:6379/1'#2 BACKEND配置,使用redis
  3. RESULT_BACKEND ='redis://127.0.0.1:6379/2'#3 序列化方案--》json
  4. ACCEPT_CONTENT =['json']
  5. TASK_SERIALIZER ='json'# 结果序列化方案
  6. RESULT_SERIALIZER ='json'# 4 任务结果过期时间,秒
  7. TASK_RESULT_EXPIRES =60*60*24#5 时区配置
  8. TIMEZONE ='Asia/Shanghai'

在这里插入图片描述

1.4 在不同app中,创建tasks.py

  1. from celery import shared_task
  2. # 任务函数@shared_taskdefadd(a, b):return a + b

在这里插入图片描述

1.5 在项目目录下的 init.py中进行配置

加入以下代码

  1. from.celery import app as celery_app
  2. __all__ =('celery_app',)

在这里插入图片描述

二、异步任务

2.1 写一个视图函数测试

  1. views.py中加入路由
  2. urlpatterns =[...
  3. path('user/get_mobile/',celery_test.get_mobie,name='celery_test'),...]###############视图函数中 views.py###############from django.http import JsonResponse
  4. from Light.tasks import add
  5. from django.shortcuts import HttpResponse
  6. defget_mobie(request):
  7. mobile =int(request.GET.get('mobile'))print(mobile)# 通过delay来调用异步方法,如果在tasks中,# add这个函数没有被shared_task修饰,那么这里就会报错
  8. res = add.delay(mobile,5)return JsonResponse({'code':200,'msg': res.id})

2.2 启动worker

  1. #celery -A 项目名 worker -l debug
  2. celery -A TB_test worker -l debug

ps:好像在windows需要额外

  1. pip install eventlet
  1. celery -A TB_test worker worker -l debug -P eventlet

2.3 启动浏览器,输入地址,查看结果

在这里插入图片描述

2.4 woker获取任务,执行

在这里插入图片描述

三、定时任务

3.1 django的配置文件配置

  1. from datetime import timedelta
  2. CELERYBEAT_SCHEDULE ={'every_5_second':{'task':'Light.tasks.add',# 设置每隔5s执行一次add任务'schedule': timedelta(seconds=5),'args':(33,44),}}

在这里插入图片描述

3.2 重启woker,启动beat

celery执行定时任务的是beat,在开头的celery框架可以看出

  1. # 启动一个worker
  2. celery -A TB_test worker -l debug
  3. # 启动定时任务
  4. celery -A TB_test beat -l debug

在这里插入图片描述
beat就会按照配置时间5s把任务提交一次

四、通过Admin 后台管理添加定时任务

  1. CELERYBEAT_SCHEDULE ={'every_5_second':{'task':'Light.tasks.add',# 设置每隔5s执行一次add任务'schedule': timedelta(seconds=5),'args':(33,44),}}# 现目前存在问题:
  2. 如果要再新加一个定时任务(例如爬新闻数据)
  3. 我们只能修改代码 settings.py-->加入代码
  4. 重启worker,重启beat--》才能行
  5. 这样操作起来很麻烦
  6. # 所以想要直接通过点点点,就能自动添加定时任务
  7. 那么就可以引入
  8. - Admin 后台管理添加定时任务

4.1 引入–安装djiango-celery-beat

  1. pip install django-celery-beat

4.2 在app中注册djiango-celery-beat

  1. INSTALLED_APPS =[...'app01','django_celery_beat'# 注册刚刚第三方模块]

4.3 配置时区

  1. # settings.py
  2. LANGUAGE_CODE ='zh-hans'
  3. TIME_ZONE ='Asia/Shanghai'
  4. USE_I18N =True
  5. USE_L10N =True
  6. USE_TZ =False# 配置调度器# 只要配了这个,原来celery中的定时任务统一不能用了,需要我们手动配置了
  7. CELERYBEAT_SCHEDULER ='django_celery_beat.schedulers.DatabaseScheduler'

4.4 配置数据库,进行数据迁移

  1. - 需要先安装mysql,用mysql创建一个数据库
  2. - 再安装python中链接mysql需要用到的
  3. - pip install mysqlclient
  4. - pip install pymysql
  1. ################ settings.py ################
  2. DATABASES ={'default':{'ENGINE':'django.db.backends.mysql','NAME':'Simpleuse',# 数据库名字'USER':'root','PASSWORD':'xxx','HOST':'127.0.0.1',# ip'PORT':3306,}}################ app01/__init__.py ################import pymysql
  3. pymysql.install_as_MySQLdb()

在这里插入图片描述

  1. 命令行执行
  2. python3 manage.py makemigrations
  3. python3 manage.py migrate
  4. # django-celery-beat 这个app会产生表--》以后只要咱么在表里添加记录,就能制定定时任务

在这里插入图片描述
到此,数据库表就创建好了。

4.5 使用admin后台管理插入数据

4.5.1 创建账号

  1. -django提供了一个后台管理--》登录到后台管理,可以图形化界面录入数据
  2. -但是需要个账号登录:命令创建账号
  3. python3 manage.py createsuperuser

在这里插入图片描述

4.5.2 打开网页,登录

在这里插入图片描述
在这里插入图片描述
界面略微丑陋,美化一下

4.6 美化admin界面

  1. # 1 simpleui 美化admin# 2 开源地址
  2. https://gitee.com/tompeppa/simpleui
  3. # 3 文档地址
  4. https://newpanjing.github.io/simpleui_docs/config.html
  5. # 4 安装
  6. pip3 install django-simpleui
  7. # 5 app中注册
  8. INSTALLED_APPS =['simpleui',...]

在这里插入图片描述

4.7 手动添加周期任务

  1. # 1 启动worker,beat# 启动worker
  2. celery -A Simpleuse worker -l debug
  3. # 启动beat
  4. celery -A Simpleuse beat -l debug

在这里插入图片描述

五、通过Admin查看任务运行情况

  1. # 在控制台监控任务执行情况或者去redis中查看,还不是很方便,最好是能够通过web界面看到任务的执行情况,如有多少任务在执行,有多少任务执行失败了等。# 这个Celery也是可以做到了,就是将任务执行结果写到数据库中,通过web界面显示出来。
  2. 这里要用到django-celery-results插件。
  3. 通过插件可以使用Djangoorm作为结果存储,这样的好处在于我们可以直接通过django的数据查看到任务状态,同时为可以制定更多的操作

5.1 安装django-celery-results

  1. pip install django-celery-results

5.2 在app中注册

  1. INSTALLED_APPS =(...,'django_celery_results',)

5.3 修改配置文件

  1. # 让之前backend----》结果存储放在redis中----》改到放到数据中---》因为在数据库中的咱们可以通过admin查看#RESULT_BACKEND = 'redis://127.0.0.1:6379/1'# 使用使用django orm 作为结果存储
  2. CELERY_RESULT_BACKEND ='django-db'#使用django orm 作为结果存储

在这里插入图片描述

5.4 迁移数据库

  1. # 执行迁移命令
  2. python3 manage.py makemigrations
  3. python3 manage.py migrate

可以看到数据库多出了3张存储结果的表
在这里插入图片描述
在这里插入图片描述

六、通过flower插件监控任务情况

  1. Flower 是一个用于监控和管理 Celery 集群的开源 Web 应用程序。它提供有关 Celery workers tasks状态的实时信息
  2. # Flower可以:1 实时监控celery的Events
  3. -查看任务进度和历史记录
  4. -查看任务详细信息(参数、开始时间、运行时间等)
  5. 2 远程操作
  6. -查看workers 状态和统计数据
  7. -关闭并重新启动workers 实例
  8. -控制工作池大小和自动缩放设置
  9. -查看和修改工作实例消耗的队列
  10. -查看当前正在运行的任务
  11. -查看计划任务(预计到达时间/倒计时)
  12. -查看保留和撤销的任务
  13. -应用时间和速率限制
  14. -撤销或终止任务
  15. 3 Broker 监控
  16. -查看所有 Celery 队列的统计信息

6.1 安装flower和启动

  1. #1 安装
  2. pip install flower
  3. # 2 启动# celery -A 项目名 flower --port-指定端口号# 项目名变了,这里下班了,在家换了一个电脑写,但是逻辑是一样的。
  4. celery -A Simpleuse flower --port-5555#3 浏览器访问:
  5. http://127.0.0.1:5555/
  6. 获取更详细:http://127.0.0.1:5555/tasks
  7. # 4 启动 worker,beat,flower-一般先启动flower

在这里插入图片描述

这个要比admin的看起来更友好一些

标签: django 数据库 python

本文转载自: https://blog.csdn.net/qq_42222846/article/details/138169545
版权归原作者 ILUUSION_S 所有, 如有侵权,请联系我们删除。

“Django中celery的使用”的评论:

还没有评论