使用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 相关文章推荐
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
Python3.6安装及引入Requests库的实现方法
Jan 24 Python
python2.7无法使用pip的解决方法(安装easy_install)
Apr 03 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
python传到前端的数据,双引号被转义的问题
Apr 03 Python
python 判断一组数据是否符合正态分布
Sep 23 Python
Python测试框架:pytest学习笔记
Oct 20 Python
Pycharm安装python库的方法
Nov 24 Python
Python 按比例获取样本数据或执行任务的实现代码
Dec 03 Python
如何利用Python matplotlib绘制雷达图
Dec 21 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调用三种数据库的方法(3)
2006/10/09 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
javascript实现无限级select联动菜单
2015/01/02 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
Python open()文件处理使用介绍
2014/11/30 Python
Python进程间通信用法实例
2015/06/04 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
优秀医生事迹材料
2014/02/12 职场文书
学校督导评估方案
2014/06/10 职场文书
会计人员演讲稿
2014/09/11 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
订货会主持词
2015/07/01 职场文书
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python