使用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类的用法实例浅析
May 27 Python
python中子类调用父类函数的方法示例
Aug 18 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
20行python代码的入门级小游戏的详解
May 05 Python
python3.7简单的爬虫实例详解
Jul 08 Python
postman传递当前时间戳实例详解
Sep 14 Python
python绘制雪景图
Dec 16 Python
pandas参数设置的实用小技巧
Aug 23 Python
Python实现快速大文件比较代码解析
Sep 04 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
python中出现invalid syntax报错的几种原因分析
Feb 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中explode与split的区别介绍
2012/10/03 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
实现JavaScript中继承的三种方式
2009/10/16 Javascript
javascript深入理解js闭包
2010/07/03 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
python3.5绘制随机漫步图
2018/08/27 Python
windows下python安装小白入门教程
2018/09/18 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
Python配置文件处理的方法教程
2019/08/29 Python
Python实现代码统计工具
2019/09/19 Python
python logging添加filter教程
2019/12/24 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
宿舍违规用电检讨书
2014/02/16 职场文书
护士自我鉴定总结
2014/03/24 职场文书
高中教师评语大全
2014/04/25 职场文书
年度考核表个人总结
2015/03/06 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript