使用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实现基本线性数据结构
Aug 22 Python
Python之pymysql的使用小结
Jul 01 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
使用python实现画AR模型时序图
Nov 20 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
TensorBoard 计算图的可视化实现
Feb 15 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
Python读取excel文件中带公式的值的实现
Apr 17 Python
Python logging模块异步线程写日志实现过程解析
Jun 30 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 Python
图神经网络GNN算法
May 11 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
VBScript版代码高亮
2006/06/26 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
JavaScript实现预览本地上传图片功能完整示例
2019/03/08 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
python回调函数用法实例分析
2015/05/09 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
纽约手袋品牌:KARA
2018/03/18 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
优秀中学生事迹材料
2014/01/31 职场文书
作弊检讨书1000字
2014/02/01 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
五年级小学生评语
2014/12/26 职场文书
redis 解决库存并发问题实现数量控制
2022/04/08 Redis