使用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中list循环语句用法实例
Nov 10 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
Apr 13 Python
使用Python的Scrapy框架编写web爬虫的简单示例
Apr 17 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
python时间序列按频率生成日期的方法
May 14 Python
pandas DataFrame创建方法的方式
Aug 02 Python
Python中的引用和拷贝实例解析
Nov 14 Python
python将数组n等分的实例
Dec 02 Python
python字符串的index和find的区别详解
Jun 20 Python
关于Python中*args和**kwargs的深入理解
Aug 07 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
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
PHP基于imap获取邮件实例
2014/11/11 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
2016/08/02 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python入门之三角函数全解【收藏】
2017/11/08 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
热能动力工程毕业生自荐信
2013/11/07 职场文书
机电专业毕业生推荐信
2013/11/10 职场文书
经销商年会策划方案
2014/05/29 职场文书
报到证办理个人委托书
2014/10/06 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
TS 类型收窄教程示例详解
2022/09/23 Javascript