使用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 sys.path详细介绍
Oct 17 Python
Python contextlib模块使用示例
Feb 18 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Python WSGI的深入理解
Aug 01 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 Python
pytorch 预训练层的使用方法
Aug 20 Python
Python实现word2Vec model过程解析
Dec 16 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
python调用摄像头的示例代码
Sep 28 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 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完整的日历类(CLASS)
2006/11/27 PHP
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP生成Flash动画的实现代码
2010/03/12 PHP
PHP新手入门学习方法
2011/05/08 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
javascript parseInt与Number函数的区别
2010/01/21 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
如何安装ruby on rails
2014/02/09 面试题
商场消防管理制度
2014/01/12 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
租车协议书
2015/01/27 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
中学团支部工作总结
2015/08/13 职场文书
小学三年级作文之写景
2019/11/05 职场文书