Python—在Django中使用Celery
一.Django中的请求
Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下:
http请求发起
经过中间件
http handling(request解析)
url mapping(url匹配找到对应的View)
在View中进行逻辑(包括调用Model类进行数据库的增删改查)
经过中间件
返回对应的template/response。
同步请求:所有逻辑处理、数据计算任务在View中处理完毕后返回response。在View处理任务时用户处于等待状态,直到页面返回结果。
异步请求:View中先返回response,再在后台处理任务。用户无需等待,可以继续浏览网站。当任务处理完成时,我们可以再告知用户。
二.Django中使用Celery
安装
pip3 install django-celery
配置
首先创建一个django项目,结构如下:
之后再settings.py的同级目录添加celeryconfig.py配置文件,更多配置信息可以参考官方文档。
import djcelery from datetime import timedelta djcelery.setup_loader() # 导入任务 CELERY_IMPORTS = [ 'celeryapp.tasks' ] # 设置队列 CELERY_QUEUES = { 'beat_tasks': { 'exchange': 'beat_tasks', 'exchange_type': 'direct', 'binding_key': 'beat_tasks' }, 'work_queue': { 'exchange': 'work_queue', 'exchange_type': 'direct', 'binding_key': 'work_queue' } } # 设置默认列队,不符合其他队列的任务放在默认队列 CELERY_DEFAULT_QUEUE = 'work_queue' # 有些情况下可以防止死锁 CELERYD_FORCE_EXECV = True # 设置并发数量 CELERYD_CONCURRENCY = 4 # 每个worker最多执行100个任务,防止泄露内存 CELERYD_MAX_TASKS_PER_CHILD = 100 # 单个任务最多执行时间 CELERYD_TASK_TIME_LIMIT = 12 * 30 # 设置定时执行 CELERYBAET_SCHEDULE = { 'task1': { 'task': 'course-task', 'schedule': timedelta(seconds=5), 'options': { 'queue': 'beat_tasks' } } } CELERY_ACCEPT_CONTENT = ['pickle', 'json', ] BROKER_BACKEND = 'redis' BROKER_URL = 'redis://localhost:6379/1' CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
启动redis作为消息中间人
启动django项目,然后访问http://localhost:8000/course/,触发任务
python manage.py runserver
启动worker
python manage.py celery worker -l info
可以看到配置情况,以及任务的执行情况:
启动beat
python manage.py celery beat -l info
三.常见错误
♦ AttributeError: ‘str’ object has no attribute ‘items’
解决方法: redis版本过高,降低redis版本即可
pip install redis==2.10.6
♦ from kombu.async.timer import Entry, Timer as Schedule, to_timestamp, logger SyntaxError: invalid syntax
这个是python3.7目前不支持kombu,降低python版本至3.6即可,可以使用conda进行直接安装
conda install python=3.6.8
四.过程监控
Celery提供了一个工具flower,将各个任务的执行情况、各个worker的健康状态进行监控并以可视化的方式展现。
安装监控
pip install flower
执行flower
python manage.py celery flower
本地端口:5555查看监控
刷新course页面,查看tasks,发现有刚刚执行完成的任务
查看broker
进入Monitor查看任务执行情况,执行成功,执行失败,消耗的时间,队列里面的任务情况
点击的worker查看具体worker情况
可以给flower添加密码认证,添加之后再访问则需要输入用户名和密码
python manage.py celery flower --basic_auth=username:password
转载请注明:SuperIT » Python—在Django中使用Celery
【推荐】博客园 & 陌上花开HIMMR 给单身的程序员小哥哥助力脱单啦~
【推荐】博客园x示说网联合策划,AI实战系列公开课第二期
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【推荐】 阿里云双十一返场继续,云服务器0.73折起
【推荐】年薪100w+的技术人,都做对了什么?
· Python-Celery
· Python—Celery框架使用
· Django集成celery发送异步邮件
· Celery
· celery+django+mq异步任务与定时任务
» 更多推荐…
· 奔驰柏林发动机工厂主管跳槽特斯拉,管理新工厂?
· 谷歌相册明年取消无限容量:不花钱最多15GB
· SpaceX完成火箭静态点火测试,周末将载人发射
· 国家邮政局:双11当天6.75亿件快件 创历史新高
· 美股科技股反弹 双11拼多多涨8%京东涨3%阿里微跌
» 更多新闻…