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号 执行一次