使用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 正则表达式 概述及常用字符
May 04 Python
使用python开发vim插件及心得分享
Nov 04 Python
python验证码识别教程之滑动验证码
Jun 04 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
Python合并同一个文件夹下所有PDF文件的方法
Mar 11 Python
Python的高阶函数用法实例分析
Apr 11 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 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中的CMS的涵义
2007/03/11 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
python抓取网页图片示例(python爬虫)
2014/04/27 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
2018/12/07 Python
详解Python循环作用域与闭包
2019/03/21 Python
python 初始化一个定长的数组实例
2019/12/02 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
Pytorch中.new()的作用详解
2020/02/18 Python
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
院药学专业个人求职信
2013/09/21 职场文书
项目经理任命书
2014/06/04 职场文书
体育运动口号
2014/06/09 职场文书
党支部四风整改方案
2014/10/25 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
Python自动化爬取天眼查数据的实现
2021/06/15 Python