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时区设置方法与pytz查询时区教程
Nov 27 Python
Python多进程编程技术实例分析
Sep 16 Python
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python使用base64模块进行二进制数据编码详解
Jan 11 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
python实现隐马尔科夫模型HMM
Mar 25 Python
Python中shapefile转换geojson的示例
Jan 03 Python
python实现词法分析器
Jan 31 Python
新手入门Python编程的8个实用建议
Jul 12 Python
python str字符串转uuid实例
Mar 03 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
深入理解python协程
Jun 15 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中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
限制文本字节数js代码
2007/03/06 Javascript
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
简明json介绍
2008/09/28 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
JS button按钮实现submit按钮提交效果
2016/11/01 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
实例详解Node.js 函数
2018/06/10 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
python3抓取中文网页的方法
2015/07/28 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
运动会广播稿150字(9篇)
2014/09/20 职场文书
2014年自愿离婚协议书范本
2014/09/25 职场文书
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python