使用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的lambda匿名函数的简单介绍
Apr 25 Python
一些Python中的二维数组的操作方法
May 02 Python
使用wxPython获取系统剪贴板中的数据的教程
May 06 Python
Python实现比较两个列表(list)范围
Jun 12 Python
Python 中 Meta Classes详解
Feb 13 Python
Python Web框架Tornado运行和部署
Oct 19 Python
Python即时网络爬虫项目启动说明详解
Feb 23 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 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中调用JAVA
2006/10/09 PHP
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
PHP中改变图片的尺寸大小的代码
2011/07/17 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
PDO::getAttribute讲解
2019/01/28 PHP
纯js实现背景图片切换效果代码
2010/11/14 Javascript
关于js datetime的那点事
2011/11/15 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
Javascript实现一朵从含苞到绽放的玫瑰
2019/03/30 Javascript
Node.js 实现抢票小工具 & 短信通知提醒功能
2019/10/22 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
python多线程共享变量的使用和效率方法
2019/07/16 Python
python pillow模块使用方法详解
2019/08/30 Python
pymysql 开启调试模式的实现
2019/09/24 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
2014年银行员工年终自我评价
2014/09/19 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
Js类的构建与继承案例详解
2021/09/15 Javascript