使用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 06 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
简单了解django索引的相关知识
Jul 17 Python
Python获取时间戳代码实例
Sep 24 Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
python如何写个俄罗斯方块
Nov 06 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
对Pytorch 中的contiguous理解说明
Mar 03 Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Apr 24 Python
PyTorch 实现L2正则化以及Dropout的操作
May 27 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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
php中的时间显示
2007/01/18 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
深入解析contentWindow, contentDocument
2013/07/04 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
Python实现备份文件实例
2014/09/16 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
Python 字符串换行的多种方式
2018/09/06 Python
Python安装OpenCV的示例代码
2020/03/05 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
Python把图片转化为pdf代码实例
2020/07/28 Python
Python 使用office365邮箱的示例
2020/10/29 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
医学检验专业大学生求职信
2013/11/18 职场文书
养殖项目策划书范文
2014/01/13 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
家具商场的活动方案
2014/08/16 职场文书
党章培训心得体会
2014/09/04 职场文书
治庸问责工作总结
2015/08/11 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers