Bootstrap

Django框架(十六)--redis,celery异步任务

IO密集型–使用多线程

计算密集型–使用多进程

一、celery

在web开发中,要给用户发送邮件,发送短信,都属于耗时的操作,会导致给用户响应的时间变长。这种情况的解决办法,就是给用户先返回一个响应,不要影响用户的使用。将这些耗时的操作,放在后台执行,例如新开一个进程,celery就是用来处理这个问题的。

celery组成部分

  • worker
    • 工人,执行任务的单元
  • broker
    • 消息中间件,即中间人
    • 用来在服务和worker中传递消息
    • redis
  • backend
    • 用来存储消息以及celery执行结果

Django封装了celery,叫做django-celery

(一)django+celery+redis

Redis

使用cmd切换进解压路径

在这里插入图片描述

启动

打开另一个cmd窗口,可使用

在这里插入图片描述

关闭

在这里插入图片描述

初始状态是下标为0的数据库,切换数据库

Redis中有16个数据库

在这里插入图片描述

字符串类型

在这里插入图片描述

(二)Django的celery异步任务

和之前的开发相比,django-celery只是将任务发布出去,处理耗时操作。比如发送邮件,发送短信,爬虫,使用异步任务去实现,使得主进程不会阻塞。web服务只负责发起任务和接收任务的结果,中间执行的过程交给异步任务处理。

安装注册

pip install django-celery
pip install django-redis
pip install redis==2.10.6

在这里插入图片描述

配置

在这里插入图片描述

创建子应用,新建文件

在这里插入图片描述
在这里插入图片描述

在主项目下创建celery.py

在这里插入图片描述

编写celery.py

在这里插入图片描述

编写tasks.py任务文件

from __future__ import absolute_import
from Qshop.celery import app

# 创建任务
@app.task    # 将普通的函数转换为celery任务
def test():
    print('--------I am test task--------')
    return 'I am test task'

进行数据迁移

启动celery

python manage.py celery worker --loglevel=info

在这里插入图片描述

tasks.py
from __future__ import absolute_import
from Qshop.celery import app
import time

# 创建任务
@app.task    # 将普通的函数转换为celery任务
def test():
    time.sleep(2)
    print('--------I am test task--------')
    return 'I am test task'

@app.task
def myprint(name,age):
    time.sleep(5)
    print('%s:%s'%(name,age))
    return 'I am myprint'
views.py
from CeleryTask.tasks import *
def reqtest(request):
    # 执行celery任务
    # test.delay()    # 发布任务
    name = request.GET.get('name')
    age = request.GET.get('age')
    myprint.delay(name,age)
    return HttpResponse('req test')
路由

在这里插入图片描述

(三)celery的定时任务

1.timedelta

配置

在这里插入图片描述

启动定时任务

启动之前,确保redis,worker启动

python manage.py celerybeat --loglevel=info

在这里插入图片描述

2.crontab

crontab(hour='*/2')    # 每隔两个小时执行一次
crontab(minute=0,hour='*/2')    # 每隔两个小时的0分执行一次
crontab(minute = 0,hour="*/2,8-12")    # 每隔两小时或者是8到12点执行 
crontab(minute = 0,hour=0,day_of_month="2-31/2")    # 偶数天执行 
crontab(minute = 0,hour=0,day_of_month="1" month_of_year="5")    # 每年的5月1号 执行一次

异步事务–实现发送短信验证

tasks.py

在这里插入图片描述

视图

在这里插入图片描述

路由

在这里插入图片描述

;