Django+Celery实现动态配置定时任务的方法示例


Posted in Python onMay 26, 2020

哈喽,今天给大家分享一篇Django+Celery实现动态配置定时任务,因为最近也是无意间看到一位大佬关于这块的文章,然后自己觉得不错,也想学习写一下,然后最终实现功能是在前端页面统一管理计划任务,大家可以在admin管理页面设置,也可以在自己写的前端页面删除添加编辑,实时生效,还可以监控这些监控任务是否运行成功失败。

补充:如果大家对celery不熟悉的话,建议先学习celery

Django+Celery实现动态配置定时任务的方法示例

一、安装

1.在Linux系统上安装模块

celery (3.1.26.post2)
celery-with-redis (3.0)
redis (2.10.6)
Django (2.1.10)
django-celery (3.3.1)

2.迁移生成表

python manage.py migrate

3.查看生成的表,这几张表是上面执行命令后生成的

Django+Celery实现动态配置定时任务的方法示例

二、配置

1.添加apps

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'djcelery',  #这是要添加的
]

2.配置django时区

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

3.Celery配置

BROKER_URL = 'redis://localhost:6379' #代理人
CELERY_RESULT_BACKEND = 'redis://localhost:6379' #结果存储地址
CELERY_ACCEPT_CONTENT = ['application/json'] #指定任务接收的内容序列化类型
CELERY_TASK_SERIALIZER = 'json' #任务序列化方式
CELERY_RESULT_SERIALIZER = 'json' #任务结果序列化方式
CELERY_TASK_RESULT_EXPIRES = 12 * 30 #超过时间
CELERY_MESSAGE_COMPRESSION = 'zlib' #是否压缩
CELERYD_CONCURRENCY = 4 #并发数默认已CPU数量定
CELERYD_PREFETCH_MULTIPLIER = 4 #celery worker 每次去redis取任务的数量
CELERYD_MAX_TASKS_PER_CHILD = 3 #每个worker最多执行3个任务就摧毁,避免内存泄漏
CELERYD_FORCE_EXECV = True #可以防止死锁
CELERY_ENABLE_UTC = False #关闭时区
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定时任务调度器

4.在你项目的app下面配置celery.py

import os
from celery import Celery,platforms
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE','blog.settings')
app = Celery('blog')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
platforms.C_FORCE_ROOT = True

@app.task(bind=True)
def debug_task(self):
  print('Request: {0!r}'.format(self.request))

5.配置刚才app下面的__init__.py文件

from __future__ import absolute_import
from .celery import app as celery_app

6.在app下面创建一个tasks.py文件

from blog.celery import app
@app.task()
def get_date(x,y,s):#这里的函数留意一下,后面会用到
  print(s)
  return x + y

@app.task()
def get_task():
  return 'test'

@app.task()
def get_command_task():
  return 'success'

三、启动

1.进入你项目下面,执行启动worker,Worker是执行任务的单元,它实时监控消息队列,如果有任务就获取任务并执行它。

celery -A autoops worker -l info

2.进入你项目下面,执行启动beat,beat是定时把这个任务扔到队列中

celery -A autoops beat -l info

3.启动你的django项目

python manage.py runserver 192.168.10.133:8001

4.页面展示

4.1这个是admin页面下的,然后我自己重新写了,大家也可以自己写一个,admin和我自己写的页面实现的功能其实是一模一样的。

Django+Celery实现动态配置定时任务的方法示例

4.2.对应admin页面的crontabs

Django+Celery实现动态配置定时任务的方法示例

添加周期

Django+Celery实现动态配置定时任务的方法示例

编辑修改周期

Django+Celery实现动态配置定时任务的方法示例

5.tasks任务

5.1.大家可以看到我添加了一个名为测试的任务,每隔一分钟执行一次,任务模板其实就是你写的tasks文件里面函数

Django+Celery实现动态配置定时任务的方法示例

Django+Celery实现动态配置定时任务的方法示例

看一下worker进程日志输出

Django+Celery实现动态配置定时任务的方法示例

四、监控计划任务

celery作为一个分布式异步任务队列管理工具,通过界面化的方式来进行管控任务的执行状态和查看任务执行结果

flower作为web页面来管理celery后台任务,和任务队列是隔离的,也就是flower的运行与否并不会影响到任务队列的真正执行,但是flower中可以通过API接口来管理celery中的任务执行。

4.1安装flower,监控celery计划任务

pip3 install flower==0.9.2 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install tornado==5.1.1
celery flower -A blog --port=5555 #进入项目目录启动flower

4.2打开浏览器,输入http://ip:5555 查看

Django+Celery实现动态配置定时任务的方法示例

Name: 表示该任务的名称,默认规则为该函数的路径规则,例如 {模块名}.{文件名}.{函数名}
UUID: 表示一个唯一字符串ID用于表示该任务
State: 表示该任务的状态,包括: SUCCESS / FAILURE / STARTED / RECEIVED
SUCCESS 表示该任务执行完毕且成功
FAILURE 表示该任务执行失败
STARTED 表示该任务正在执行
RECEIVED 表示该任务在worker中,只是被接收而已
args: 表示该任务的列表参数
kwargs: 表示该任务的字典参数
Result: 表示该任务函数的返回结果
Received: 表示该任务在worker接收到的时间
Started: 表示该任务在worker开始执行的时间
Runtime: 表示该任务在worker真正执行的耗时(单位:秒)
Worker: 表示该任务所在的worker名称

总结:django+celery实现的定时任务还是不错的,你可以在前端上查看管理所有定时任务,实时修改生效删除和禁用,所以有需求的话可以去试试。下次再分享啦

到此这篇关于Django+Celery实现动态配置定时任务的方法示例的文章就介绍到这了,更多相关Django Celery动态配置定时任务内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python文本特征抽取与向量化算法学习
Dec 22 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
使用Pandas将inf, nan转化成特定的值
Dec 19 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
python中执行smtplib失败的处理方法
Jul 01 Python
Python requests HTTP验证登录实现流程
Nov 05 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 Python
Python 如何安装Selenium
May 06 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
Jun 09 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 Python
python删除某个目录文件夹的方法
May 26 #Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 #Python
Pytorch转onnx、torchscript方式
May 25 #Python
使用pandas库对csv文件进行筛选保存
May 25 #Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
May 25 #Python
基于pandas向csv添加新的行和列
May 25 #Python
Python如何把十进制数转换成ip地址
May 25 #Python
You might like
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
微信公众平台天气预报功能开发
2014/07/06 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
2015/12/25 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python正则表达式介绍
2012/08/06 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
python 下划线的不同用法
2020/10/24 Python
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
保安自我鉴定范文
2013/12/08 职场文书
对公司合理化的建议书
2014/03/12 职场文书
关于安全的演讲稿
2014/05/09 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
单位病假条范文
2015/08/17 职场文书
深入理解go slice结构
2021/09/15 Golang
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers