使用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编写批量卸载手机中安装的android应用脚本
Jul 21 Python
使用Python生成url短链接的方法
May 04 Python
python实现将文本转换成语音的方法
May 28 Python
详解使用python crontab设置linux定时任务
Dec 08 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
使用python爬取B站千万级数据
Jun 08 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
编写python代码实现简单抽奖器
Oct 20 Python
Python编程中内置的NotImplemented类型的用法
Mar 23 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
论坛头像随机变换代码
2006/10/09 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
JS修改地址栏参数实例代码
2016/06/14 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
js实现数字滚动特效
2019/12/16 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
Python解析json文件相关知识学习
2016/03/01 Python
Python使用django搭建web开发环境
2017/06/09 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
python3 re返回形式总结
2020/11/20 Python
pip install命令安装扩展库整理
2021/03/02 Python
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
linux面试题参考答案(1)
2016/01/22 面试题
大学生应聘自荐信
2013/10/11 职场文书
求职自荐信范文格式
2013/11/29 职场文书
社区好人好事材料
2014/12/26 职场文书
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android