Django-celery-beat动态添加周期性任务实现过程解析


Posted in Python onNovember 26, 2020

前期准备

1.beat插件安装

pip3 install django-celery-beat

2.注册APP

INSTALLED_APPS = [
....
'django_celery_beat',
]

3.数据库变更

python3 manage.py migrate django_celery_beat

配置工作

目录结构请参考://3water.com/article/200659.htm

1.配置celerypro.py

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
from django.utils import timezone

# set the default Django settings module for the 'celery' program.
# 为celery设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'voice_quality_assurance_configure.settings')
# 创建celery app
app = Celery('voice_quality_assurance_configure')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
# 从单独的配置模块中加载配置
app.config_from_object('voice_quality_assurance_configure.celeryconfig')
# 设置app自动加载任务
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
# 解决时区问题,定时任务启动就循环输出
app.now = timezone.now

2.配置celeryconfig.py

from __future__ import absolute_import
from kombu import Queue
from django.conf import settings

# 设置代理人broker
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/2'
# 指定 Backend
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
# 指定时区,默认是 UTC
CELERY_TIMEZONE='Asia/Shanghai'
# celery 序列化与反序列化配置
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_ACCEPT_CONTENT = ['pickle', 'json']
CELERY_IGNORE_RESULT = True
# celery 的启动工作数量设置
CELERY_WORKER_CONCURRENCY = 10
# 任务预取功能,会尽量多拿 n 个,以保证获取的通讯成本可以压缩。
CELERYD_PREFETCH_MULTIPLIER = 20
# 有些情况下可以防止死锁
CELERYD_FORCE_EXECV = True
# celery 的 worker 执行多少个任务后进行重启操作
CELERY_WORKER_MAX_TASKS_PER_CHILD = 100
# 禁用所有速度限制,如果网络资源有限,不建议开足马力。
CELERY_DISABLE_RATE_LIMITS = True

# celery beat配置(周期性任务设置)
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = settings.TIME_ZONE
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'

3.分别启动woker和beta

项目根目录终端执行(voice_quality_assurance_configure为项目名称,简单来说,和manage.py文件同级)

celery -A voice_quality_assurance_configure beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler #

启动beta 调度器使用数据库

celery worker -A voice_quality_assurance_configure --loglevel=info -n worker1 #启动celery worker

4.创建周期性任务

from datetime import datetime, timedelta
import json
import os,django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "voice_quality_assurance_configure.settings")# project_name 项目名称
django.setup()
from django_celery_beat.models import PeriodicTask, IntervalSchedule
schedule, created = IntervalSchedule.objects.get_or_create(every=10,period=IntervalSchedule.SECONDS,)

# 带参数的创建方法,如下:
PeriodicTask.objects.create(
   interval=schedule,     # 上面创建10秒的间隔 interval 对象
   name='test_task',     # 设置任务的name值
   task='mission.tasks.my_task', # 指定需要周期性执行的任务
   args=json.dumps([10, 2, 76]),
  expires=datetime.utcnow() + timedelta(seconds=30)
)

详解创建周期性任务的方法

创建基于interval的周期性任务

第一步创建间隔对象

schedule, created = IntervalSchedule.objects.get_or_create(
  every=10,
  period=IntervalSchedule.SECONDS,
)

IntervalSchedule.DAYS 固定间隔天数
IntervalSchedule.HOURS 固定间隔小时数
IntervalSchedule.MINUTES 固定间隔分钟数
IntervalSchedule.SECONDS 固定间隔秒数
IntervalSchedule.MICROSECONDS 固定间隔微秒

第二步创建任务

无参数的创建方法:

PeriodicTask.objects.create(
   interval=schedule,         # we created this above.
   name='test_task',     # simply describes this periodic task.
   task='app名.tasks.任务函数名', # name of task.)

有参数的创建方法:

PeriodicTask.objects.create(
   interval=schedule,         # we created this above.
   name='test'_task',     # simply describes this periodic task.
   task='app名.tasks.任务函数名', # name of task. 
 args=json.dumps(['arg1', 'arg2']), 
   kwargs=json.dumps({ 'be_careful': True, }), 
   expires=datetime.utcnow() + timedelta(seconds=30) )
class MonitorDeviceTask(object):
  """
  设备创建,增加周期性任务
  """

  def __init__(self, device_obj):
    self.device_obj = device_obj
    self.periodic_task = PeriodicTask.objects.create(
      interval=schedule,
      name='test_task',
      task='mission.tasks.my_task',
      args=json.dumps([self.device_obj.ip])
    )

  def starttask(self):
    """
    启动任务
    """
    self.periodic_task.enabled = True
    self.periodic_task.save()

  def stoptask(self):
    """
    停止任务
    """
    self.periodic_task.enabled = False
    self.periodic_task.save()

  def deltask(self):
    """
    删除任务
    """
    self.periodic_task.delete()  
    self.periodic_task.save()

创建基于 crontab 的周期性任务

from django_celery_beat.models import CrontabSchedule, PeriodicTask
schedule, _ = CrontabSchedule.objects.get_or_create(
   minute='30',
   hour='*',
   day_of_week='*',
   day_of_month='*',
   month_of_year='*',
   timezone=pytz.timezone('Canada/Pacific')
)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现无证书加密解密实例
Oct 27 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
Python实现将HTML转换成doc格式文件的方法示例
Nov 20 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
python单例模式的多种实现方法
Jul 26 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
浅谈Python类中的self到底是干啥的
Nov 11 Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 Python
python 制作本地应用搜索工具
Feb 27 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
详解Python类和对象内容
Jun 22 Python
Django celery异步任务实现代码示例
Nov 26 #Python
Django通过设置CORS解决跨域问题
Nov 26 #Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 #Python
python模拟点击在ios中实现的实例讲解
Nov 26 #Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 #Python
python 实现超级玛丽游戏
Nov 25 #Python
python 制作简单的音乐播放器
Nov 25 #Python
You might like
PHP以及MYSQL日期比较方法
2012/11/29 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
浅入深出Vue之自动化路由
2019/08/06 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
基于python实现从尾到头打印链表
2019/11/02 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
高中三年学习生活的自我评价
2013/10/10 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
给老师的一封建议书
2014/03/13 职场文书
求职信范文大全
2014/05/26 职场文书
经理任命书模板
2014/06/06 职场文书
禁烟标语大全
2014/06/11 职场文书
党员自我剖析材料(群众路线)
2014/10/06 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
考研导师推荐信范文
2015/03/27 职场文书
农村党员干部承诺书
2015/05/04 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书