使用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和php通信乱码问题解决方法
Apr 15 Python
Python中的生成器和yield详细介绍
Jan 09 Python
Python装饰器用法实例总结
Feb 07 Python
Python实战购物车项目的实现参考
Feb 20 Python
Pandas实现dataframe和np.array的相互转换
Nov 30 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
python与pycharm有何区别
Jul 01 Python
使用OpenCV实现道路车辆计数的使用方法
Jul 15 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 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
分享一个Laravel好用的Cache宏
2015/03/02 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
vue自定义指令用法经典实例小结
2019/03/16 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
Python入门篇之字典
2014/10/17 Python
浅谈编码,解码,乱码的问题
2016/12/30 Python
python操作kafka实践的示例代码
2019/06/19 Python
Python批量启动多线程代码实例
2020/02/18 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
Linux操作面试题
2015/02/11 面试题
酒店管理毕业生自荐信
2013/10/24 职场文书
阿德的梦教学反思
2014/02/06 职场文书
洗手间标语
2014/06/23 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
中学生检讨书范文
2014/11/03 职场文书
爱心捐款感谢信
2015/01/20 职场文书
2015年手术室工作总结
2015/05/11 职场文书