使用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程序抓取新浪在国内的所有IP的教程
May 04 Python
详解Python中的strftime()方法的使用
May 22 Python
Python实现二维有序数组查找的方法
Apr 27 Python
flask框架使用orm连接数据库的方法示例
Jul 16 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
你可能不知道的Python 技巧小结
Jan 29 Python
python scatter函数用法实例详解
Feb 11 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
Jul 13 Python
python绘制高斯曲线
Feb 19 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 Python
python非标准时间的转换
Jul 25 Python
Python图像处理库PIL详细使用说明
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
Zend 输出产生XML解析错误
2009/03/03 PHP
php实现的mongodb操作类实例
2015/04/03 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
Django开发的简易留言板案例详解
2018/12/04 Python
python 杀死自身进程的实现方法
2019/07/01 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
python常量折叠基础知识点讲解
2021/02/28 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
消防安全承诺书
2014/05/22 职场文书
电教室标语
2014/06/20 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
介绍信格式样本
2015/05/05 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python