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多线程学习资料
Dec 19 Python
python人人网登录应用实例
Sep 26 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
对PyTorch torch.stack的实例讲解
Jul 30 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
python打开windows应用程序的实例
Jun 28 Python
python把转列表为集合的方法
Jun 28 Python
python实现按行分割文件
Jul 22 Python
Python多线程获取返回值代码实例
Feb 17 Python
python新手学习使用库
Jun 11 Python
python selenium 获取接口数据的实现
Dec 07 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+APACHE实现用户论证的方法
2006/10/09 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
Python3实现配置文件差异对比脚本
2019/11/18 Python
python3 实现口罩抽签的功能
2020/03/11 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
面试后的英文感谢信
2014/02/01 职场文书
银行金融服务方案
2014/06/11 职场文书
应聘教师求职信
2014/07/19 职场文书
反对四风问题自我剖析材料
2014/09/29 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
新手初学Java网络编程
2021/07/07 Java/Android
Python操作CSV格式文件的方法大全
2021/07/15 Python