一、Django 异步编程
在之前的开发过程当中,django都是使用单线程结构,比如,请求一个视图,视图向数据库写入30000条数据,那么整个页面进入等待状态,类似的需求是有的,但是用户体验不可以是这样:
- 比如,发短信
- 比如,django调用爬虫
- 比如,大规模数据写入
异步编程的底层可以用多线程实现,但是在开发当前有一个很成熟的异步编程框架加载 celery,我们要是用的是django封装好的celery框架,django-celery。
二、celery框架认识
celery 是一个简单的,灵活的,可靠的python编写处理大量消息的分布式系统。
分布式:就是将任务分发个多个客户端进行处理的模式。通常在python当中使用的分布式有两种:
- 1、redis分布式,利用redis广告模式进行分布式
- 2、使用celery进行分布式
分布式开发,一定涉及一个设计模式:生产消费者模式
celery 基本原理
使用celery需要的组件
1、pip install celery
2、需要消息队列
- rabbitmq 消息队列
- Redis
- 其他数据库
在整个celery开发的过程当中要有存放任务的容器,这个容器可以是redis数据库,可以是其他数据库,还可以是rabbitmq消息队列。如果任务有结果还需要设置一个容器来存放结果。
三、Django-celery部署安装
使用django-celery+redis进行异步任务处理
1、安装包
pip install django-celery=3.2.2
pip install django-redis=4.10.0
pip install redis==2.10.6
pip install flower #可视化平台
2、配置setting
安装App
全局配置
# celery配置
import djcelery # 导入django-celery模块
djcelery.setup_loader() # 加载模块
BROKER_URL = 'redis://127.0.0.1:6379/1' # 任务容器地址,Redis数据库地址
CELERY_IMPORTS = ('CeleryTask.tasks') # 具体的任务文件
CELERY_TIMEZONE = 'Asia/Shanghai' # celery时区
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # celery处理器
3、给celery创建独立的app
python manage.py startapp CeleryTask
4、在项目的主目录下编写celery控制文件
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings
# 设置celery执行的环境变量,执行django项目的配置文件
os.environ.setdefault("DJANGO_SETTINGS_MODULE","CeleryTask.settings")
# 创建celery应用
app = Celery('celely_task') # celery应用的名称
app.config_from_object('django.conf:settings') # 加载的配置文件
# 如果在工程的应用中创建了tasks.py模块,那么Celery应用就会自动去检索创建的任务。比如你添加了一个任#务,在django中会实时地检索出来。
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
5、在CeleryTask App下编写任务文件,文件名必须是tasks.py
from __future__ import absolute_import
import requests
import json
from DjangoShop.celery import app # 在安装celery框架成功后,django新生成的模块
@app.task # 将taskExample转换为一个任务
def taskExample():
print("send email ok!")
@app.task
def add(x=1,y=2):
return x+y
@app.task
def DingTalk():
url = "https://oapi.dingtalk.com/robot/send?access_token=3854f74dd13b9cc7ae451c13efdbd0dff0749bf822d792f53b0088f44ad7b37c"
headers = {
"Content-Type": "application/json",
"Chartset": "utf-8"
}
requests_data = {
"msgtype": "text",
"text": {
"content": "睡醒了吧,熊大。你亲爱的Mom正在路上了,快点起来了!"
},
"at": {
"atMobiles": [
],
"isAtAll": True
}
}
sendData = json.dumps(requests_data)
response = requests.post(url, headers=headers, data=sendData)
content = response.json()
print(content)
6、同步数据库
python manage.py makemigrations
python manage.py migrate
同步数据后,数据库会多出如下数据表:
当配置完成celery之后python manage.py会多出很多命令
四、celery异步任务服务启动
1、必须先开启Django项目
2、启动celery之前必须先启动redis数据库服务
redis-server.exe redis.windows.conf
redis关闭要注意,关闭方式:
redis-cli.exe
shutdown
3、启动celery worker服务
python manage.py celery worker --loglevel=info
#简写:
python manage.py celery worker -l info
4、在视图当中触发一下celery任务
celery的任务需要用delay函数触发
# 触发celery任务的视图
from CeleryTask.tasks import add
from django.http import JsonResponse
def get_add(request):
add.delay(5,7)
return JsonResponse({"state":200})
访问视图对应路由触发: