使用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 相关文章推荐
Python3.0与2.X版本的区别实例分析
Aug 25 Python
Python实现抓取百度搜索结果页的网站标题信息
Jan 22 Python
python Django批量导入不重复数据
Mar 25 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
May 25 Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
python按照多个条件排序的方法
Feb 08 Python
python日期相关操作实例小结
Jun 24 Python
python中自带的三个装饰器的实现
Nov 08 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
python 实现端口扫描工具
Dec 18 Python
Python基本数据类型之字符串str
Jul 21 Python
python中字符串String及其常见操作指南(方法、函数)
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
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
php使用正则验证中文
2016/04/06 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
javascript利用apply和arguments复用方法
2013/11/25 Javascript
javascript常见操作汇总
2014/09/03 Javascript
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
python遍历数组的方法小结
2015/04/30 Python
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
python+os根据文件名自动生成文本
2019/03/21 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
高中生自我评价个人范文
2013/11/09 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
开除通知书范本
2015/04/25 职场文书
申请吧主发表的感言
2015/08/03 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
python对文档中元素删除,替换操作
2022/04/02 Python