一、celery简介
1:celery是什么
Celery是一个python开发的异步分布式任务调度模块。
2:celery是使用场景
异步任务:将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等
定时任务:定时执行某件事情,比如每天数据统计
3:celery特点
简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的。
高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务。
快速:一个单进程的celery每分钟可处理上百万个任务。
灵活: 几乎celery的各个组件都可以被扩展及自定制。
4:工作原理
Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。
消息中间件:Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等
任务执行单元:Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。
任务结果存储:Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等
二、Hello,Celery
1:版本介绍
在Django项目的环境下配合celery和redis使用异步调用
Django==3.0.4
celery==3.1.26.post2
django-celery==3.3.1
django-redis==4.7.0
redis==2.10.6
安装相应的软件包
pip install redis==2.10.6 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install django-redis==4.7.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
2:场景介绍(异步)
比如,想泡壶茶喝。当时的情况是:开水没有;水壶要洗,茶壶,茶杯要洗;火已生了,茶叶也有了。怎么办?
办法甲:洗好水壶,灌上凉水,放在火上;在等待水开的时间里,洗茶壶、洗茶杯、拿茶叶;等水开了,泡茶喝。
办法乙:先做好一些准备工作,洗水壶,灌水烧水;坐待水开了,洗茶壶茶杯,拿茶叶;一切就绪,泡茶喝。
2.1 代码架构
2.2 首先要保证redis是可以正常使用的,参考斑马斑马-05-白云之上-Redis初识
from redis importStrictRedisfrom django_redis importget_redis_connection
sr= StrictRedis("39.99.213.203", port=6379, db=1)defset_redis():
res= sr.set("name", "zhangsan")print(res)defget_redis():
res= sr.get("name")print(res)if __name__ == '__main__':#设置值
set_redis()#获取值
get_redis()
redis测试
2.3 设置url和views还有茶方法,至此计划B可以运行
from django.contrib importadminfrom django.urls importpathfrom course.views importplanA,planB
urlpatterns=[
path('admin/', admin.site.urls),
path('planA/',planA,name='planA'),
path('planB/', planB, name='planB')
]
url.py
from django.shortcuts importrenderfrom django.http importJsonResponsefrom course.tasks importCourseTaskfrom datetime importdatetimeimporttimefrom course import茶#Create your views here.
defplanA(request):
start_time=time.time()
start_= time.strftime("%H:%M:%S", time.localtime())print('A计划开始', start_time)
pc=茶.泡茶()
pc.洗水壶()#1
CourseTask.apply_async(('洗茶壶','洗茶杯', '拿茶叶'), queue='work_queue')
pc.烧水()#15
end_time =time.time()
end_= time.strftime("%H:%M:%S", time.localtime())
spendtime= str((end_time -start_time))print('B计划结束', end_time)
dict_content={}
dict_content.setdefault("beginTime", start_)
dic