使用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 相关文章推荐
pyv8学习python和javascript变量进行交互
Dec 04 Python
Python3.6正式版新特性预览
Dec 15 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
Python安装lz4-0.10.1遇到的坑
May 20 Python
python3 实现一行输入,空格隔开的示例
Nov 14 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
python标记语句块使用方法总结
Aug 05 Python
Django 框架模型操作入门教程
Nov 05 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
python中adb有什么功能
Jun 07 Python
Python return语句如何实现结果返回调用
Oct 15 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利用COM对象访问SQLServer、Access
2006/10/09 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
PHP7多线程搭建教程
2017/04/21 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
微信小程序自定义波浪组件使用方法详解
2019/09/21 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
Solaris操作系统的线程机制
2015/07/28 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
公司行政经理岗位职责
2013/12/24 职场文书
中学门卫岗位职责
2013/12/26 职场文书
阳光体育活动总结
2014/04/30 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
质量承诺书格式范文
2015/04/28 职场文书