使用celery执行Django串行异步任务的方法步骤


Posted in Python onJune 06, 2019

前言

Django项目有一个耗时较长的update过程,希望在接到请求运行update过程的时候,Django应用仍能正常处理其他的请求,并且update过程要求不能并行,也不能漏掉任何一个请求

使用celery的solo模式解决

安装redis

https://github.com/microsoftarchive/redis/releases

下载.msi文件安装,会直接将redis注册为windows服务

安装celery与redis依赖

pip install celery
pip indatll redis

一个celery应用

# celery_test.py
import time

from celery import Celery

app = Celery('tasks', broker='redis://127.0.0.1:6379/0')


@app.task
def add(x, y):
 time.sleep(5)
 return x + y

启动celery服务

celery -A celery_test.app worker --pool=solo -l info

查看完整的命令行参数列表

celery worker --help

对celery启动命令的解释

  • '-A' 是一个全局配置,定义了APP的位置
  • '--pool' 是POOL的配置,默认是prefork(并发),选择solo之后,发送的任务不会被并发执行,在worker执行任务过程中,再次发送给worker的任务会排队,执行完一个再执行另一个
  • '-l' 是WORKER的配置,定义了log级别

调用任务

>>> from celery_test import add
>>> add.delay(4,4)

因为启动了solo模式,因此,可以看到在一个add没有执行完前,即使再次发送执行add的任务,celery worker也会等到前一个任务执行完才去执行下一个

与Django结合

在装载celery应用前先setup django

import time
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demo.settings")
django.setup()

from celery import Celery

from django_app.update import update

app = Celery('tasks', broker='redis://127.0.0.1:6379/0', backend='redis://127.0.0.1:6379/0')

@app.task
def update_task():
 update()

然后在views中调用task就可以了。

from celery_test import update_task
def update_api(request):
 if request.method == "GET":
  update_task.delay()
  return HttpResponse(status=status.HTTP_200_OK)

执行过程中,程序的print信息会作为celery warning,报错信息会作为celery error

日志

在启动应用的时候指定日志文件路径

-f log_path

不设置这个参数的时候,日志默认输出到控制台

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python列表操作实例
Jan 14 Python
Python下使用Psyco模块优化运行速度
Apr 05 Python
Python中的模块导入和读取键盘输入的方法
Oct 16 Python
python3实现抓取网页资源的 N 种方法
May 02 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
对Python _取log的几种方式小结
Jul 25 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
基于Python的Jenkins的二次开发操作
May 12 Python
使用K.function()调试keras操作
Jun 17 Python
Python 中如何写注释
Aug 28 Python
Python实现自动装机功能案例分析
Oct 22 Python
浅谈Python中的正则表达式
Jun 28 Python
python opencv摄像头的简单应用
Jun 06 #Python
Python完成毫秒级抢淘宝大单功能
Jun 06 #Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 #Python
记录Python脚本的运行日志的方法
Jun 05 #Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 #Python
分享8个非常流行的 Python 可视化工具包
Jun 05 #Python
Django组件cookie与session的具体使用
Jun 05 #Python
You might like
PHP 文件系统详解
2012/09/13 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
jquery 插件学习(六)
2012/08/06 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
js实现下一页页码效果
2017/03/07 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
jQuery中each循环的跳出和结束实例
2017/08/16 jQuery
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Python之web模板应用
2017/12/26 Python
python dlib人脸识别代码实例
2019/04/04 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
英国足球店:UK Soccer Shop
2017/11/19 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
函授生自我鉴定
2014/03/25 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
医学生求职信
2014/07/01 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript
TS 类型兼容教程示例详解
2022/09/23 Javascript