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实现的下载网页源码功能示例
Jun 13 Python
python中requests库session对象的妙用详解
Oct 30 Python
Python3 加密(hashlib和hmac)模块的实现
Nov 23 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
Python异常的检测和处理方法
Oct 26 Python
python实现彩色图转换成灰度图
Jan 15 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
python中取整数的几种方法
Nov 07 Python
你需要掌握的20个Python常用技巧
Feb 28 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
thinkphp四种url访问方式详解
2014/11/28 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
2018/05/28 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
Javascript将string类型转换int类型
2010/12/09 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
jQuery EasyUI 入门必看
2016/06/03 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
python BeautifulSoup使用方法详解
2013/11/21 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
python SVD压缩图像的实现代码
2019/11/05 Python
python多进程重复加载的解决方式
2019/12/13 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
大学军训感言400字
2014/03/11 职场文书
布达拉宫的导游词
2015/02/02 职场文书
音乐会主持人开场白
2015/05/28 职场文书
信用卡收入证明范本
2015/06/12 职场文书
2016猴年春节慰问信
2015/11/30 职场文书
python中print格式化输出的问题
2021/04/16 Python
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android