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基础入门之seed()方法的使用
May 15 Python
Python验证企业工商注册码
Oct 25 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
Mar 31 Python
Python定义二叉树及4种遍历方法实例详解
Jul 05 Python
python 文本单词提取和词频统计的实例
Dec 22 Python
Python3.5面向对象与继承图文实例详解
Apr 24 Python
python实现PID算法及测试的例子
Aug 08 Python
浅析使用Python搭建http服务器
Oct 27 Python
python 基于UDP协议套接字通信的实现
Jan 22 Python
PyCharm 安装与使用配置教程(windows,mac通用)
May 12 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 字符串操作入门教程
2006/12/06 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
2014/05/04 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
js正则取值的结果数组调试方法
2018/10/10 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
2015年材料员工作总结
2015/04/30 职场文书
戒赌保证书
2015/05/11 职场文书
导游词之山西关帝庙
2019/11/01 职场文书