django中使用Celery 布式任务队列过程详解


Posted in Python onJuly 29, 2019

本文记录django中如何使用celery完成异步任务。

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。

它是一个专注于实时处理的任务队列,同时也支持任务调度。

官方网站

中文文档

示例一:用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验

示例二:网站每小时需要同步一次天气预报信息,但是http是请求触发的,难道要一小时请求一次吗?

使用celery后,情况就不一样了

示例一的解决:将耗时的程序放到celery中执行

示例二的解决:使用celery定时执行

名词

任务task:就是一个Python函数

队列queue:将需要执行的任务加入到队列中

工人worker:在一个新进程中,负责执行队列中的任务

代理人broker:负责调度,在布置环境中使用redis

本示例在ubuntu系统中,使用django1.8.2,并且要安装redis

1,首先需要安装扩展包。

pip install celery==3.1.25
pip install celery-with-redis==3.0
pip install django-celery==3.1.17

2,配置项目setting.py

加入以下代码:

import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_IMPORTS = ('bookstory.task')

CELERY_IMPORTS值是异步任务函数所在的位置,比如这个是bookstory应用里面的task.py文件里,如图:

django中使用Celery 布式任务队列过程详解

并且将'djcelery'加入到setting.py的INSTALLED_APPS里面。

3,编写需要异步执行(或者耗时)的功能函数

编写task.py文件,假设我就这样模拟耗时操作

# coding=utf-8

import time
from celery import task


@task
def showa():
  # 任务函数
  print('hello....')
  time.sleep(5)
  print('world....')

4,迁移,生成celery需要的数据表

python manage.py migrate

5,启动worker

python manage.py celery worker --loglevel=info

6,使用

新建一个视图函数,并且分配一个url

from task import *

.........

# celery异步
def showTest(request):
  showa.delay()
  return HttpResponse('哈哈哈')

调用语法就是:

function.delay(parameters)

function就是task里写的函数,parameters就是这个函数要传递的参数,我的showa没有传参数,所以就直接showa.delay()就可以调用了。

运行结果就是在浏览器中并没有等待5秒,而是直接输出'哈哈'了。并没有因为耗时的操作二延迟。在启动worker的窗口里面可以看到hello,world间隔5秒分别输出了出来:

django中使用Celery 布式任务队列过程详解

按照步骤来,其实并不难,具体异步(耗时)操作根据具体业务在task里面具体编写就ok了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python查找相似单词的方法
Mar 05 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
Python 装饰器深入理解
Mar 16 Python
python验证码识别的示例代码
Sep 21 Python
Python网页正文转换语音文件的操作方法
Dec 09 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 Python
详解python中自定义超时异常的几种方法
Jul 29 #Python
Python 离线工作环境搭建的方法步骤
Jul 29 #Python
如何通过python的fabric包完成代码上传部署
Jul 29 #Python
Python八皇后问题解答过程详解
Jul 29 #Python
python 标准差计算的实现(std)
Jul 29 #Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 #Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 #Python
You might like
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
FireFox JavaScript全局Event对象
2009/06/14 Javascript
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
JavaScript中数组常见操作技巧
2017/09/01 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
Python文件路径名的操作方法
2019/10/30 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
初任培训自我鉴定
2013/10/07 职场文书
社区志愿者心得体会
2014/01/03 职场文书
施工安全责任书范本
2014/07/24 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
通知函的格式
2015/04/27 职场文书
2015年度企业工作总结
2015/05/21 职场文书
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis