使用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)操作方法详解
Mar 11 Python
Python中用pycurl监控http响应时间脚本分享
Feb 02 Python
Python中的super用法详解
May 28 Python
详解Django中的form库的使用
Jul 18 Python
Python脚本处理空格的方法
Aug 08 Python
python 读写中文json的实例详解
Oct 29 Python
python入门前的第一课 python怎样入门
Mar 06 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
python 设置输出图像的像素大小方法
Jul 04 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
Oct 16 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
CodeIgniter生成网站sitemap地图的方法
2013/11/13 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
php常用字符函数实例小结
2016/12/29 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
js中的escape及unescape函数的php实现代码
2007/09/04 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python XML RPC服务器端和客户端实例
2014/11/22 Python
简单介绍Python中的round()方法
2015/05/15 Python
详解Django中的form库的使用
2015/07/18 Python
python实现图书管理系统
2018/03/12 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
django使用JWT保存用户登录信息
2020/04/22 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
总经理司机岗位职责
2014/02/06 职场文书
环保标语大全
2014/06/12 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
委托培训协议书
2014/11/17 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
vue+echarts实现多条折线图
2022/03/21 Vue.js