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 相关文章推荐
python3实现暴力穷举博客园密码
Jun 19 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
Pandas分组与排序的实现
Jul 23 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
Python异常模块traceback用法实例分析
Oct 22 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
torch 中各种图像格式转换的实现方法
Dec 26 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
django处理select下拉表单实例(从model到前端到post到form)
Mar 13 Python
基于python连接oracle导并出数据文件
Apr 28 Python
2021年的Python 时间轴和即将推出的功能详解
Jul 27 Python
Python 解决空列表.append() 输出为None的问题
May 23 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
PHP命名空间namespace用法实例分析
2016/09/27 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
xss文件页面内容读取(解决)
2010/11/28 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
跨平台python异步回调机制实现和使用方法
2013/11/26 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
新员工欢迎词
2014/01/12 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
平安工地汇报材料
2014/08/19 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
南京南京观后感
2015/06/02 职场文书
李强感恩观后感
2015/06/17 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书