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 25 Python
Python封装shell命令实例分析
May 05 Python
python回调函数用法实例分析
May 09 Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 Python
批处理与python代码混合编程的方法
May 19 Python
python退出命令是什么?详解python退出方法
Dec 10 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
Python对接支付宝支付自实现功能
Oct 10 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
Python使用uuid库生成唯一标识ID
Feb 12 Python
Python集合的基础操作
Nov 01 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
星际争霸中的对战模式介绍
2020/03/04 星际争霸
将RTF格式的文件转成HTML并在网页中显示的代码
2006/10/09 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
jQuery 1.0.2
2006/10/11 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
JS实现self的resend
2010/07/22 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
python中lambda与def用法对比实例分析
2015/04/30 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
Python之字典对象的几种创建方法
2020/09/30 Python
Python运算符+与+=的方法实例
2021/02/18 Python
暇步士官网:Hush Puppies
2016/09/22 全球购物
会计毕业生自我鉴定
2013/11/04 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
python中对列表的删除和添加方法详解
2022/02/24 Python
Python实现文字pdf转换图片pdf效果
2022/04/03 Python