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中用于返回绝对值的abs()方法
May 14 Python
Python smallseg分词用法实例分析
May 28 Python
python简单实现基于SSL的IRC bot实例
Jun 15 Python
python简单实现刷新智联简历
Mar 30 Python
python中数据爬虫requests库使用方法详解
Feb 11 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
对python判断ip是否可达的实例详解
Jan 31 Python
由面试题加深对Django的认识理解
Jul 19 Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
只用40行Python代码就能写出pdf转word小工具
May 31 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操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP中include()与require()的区别说明
2017/02/14 PHP
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python字符串,数值计算
2016/10/05 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python实现简易Web爬虫详解
2018/01/03 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
python实现图片批量压缩程序
2018/07/23 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
python在不同条件下的输入与输出
2020/02/13 Python
python中uuid模块实例浅析
2020/12/29 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
中专毕业生自荐信
2013/11/16 职场文书
老师对学生的寄语
2014/04/09 职场文书
假面舞会策划方案
2014/05/29 职场文书
员工生日会策划方案
2014/06/14 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书