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中使用动态变量名的方法
May 06 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 Python
Django web框架使用url path name详解
Apr 29 Python
Python3 实现文件批量重命名示例代码
Jun 03 Python
python字符串Intern机制详解
Jul 01 Python
linux环境中没有网络怎么下载python
Jul 07 Python
python3 tcp的粘包现象和解决办法解析
Dec 09 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
利用django model save方法对未更改的字段依然进行了保存
Mar 28 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
Oct 14 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 Python
如何用Django处理gzip数据流
Jan 29 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 ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
php实现文件下载更能介绍
2012/11/23 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
js Html结构转字符串形式显示代码
2011/11/15 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
2018/10/09 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python常用模块介绍
2014/11/21 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
keras:model.compile损失函数的用法
2020/07/01 Python
2020版Python学习路线图(附学习资料)
2020/09/15 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
房屋出售协议书
2014/04/10 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
田径运动会通讯稿
2015/07/18 职场文书
Python中的min及返回最小值索引的操作
2021/05/10 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python