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 相关文章推荐
windows上安装Anaconda和python的教程详解
Mar 28 Python
Python对列表中的各项进行关联详解
Aug 15 Python
django上传图片并生成缩略图方法示例
Dec 11 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
python实现翻转棋游戏(othello)
Jul 29 Python
python实现指定ip端口扫描方式
Dec 17 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
python 计算概率密度、累计分布、逆函数的例子
Feb 25 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
Python DES加密实现原理及实例解析
Jul 17 Python
python把一个字符串切开的实例方法
Sep 27 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小技巧之过滤ascii控制字符
2014/05/14 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
canvas实现钟表效果
2017/02/13 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
Python字符转换
2008/09/06 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
python3中property使用方法详解
2019/04/23 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
python文件读写代码实例
2019/10/21 Python
Python os模块常用方法和属性总结
2020/02/20 Python
解决django 向mysql中写入中文字符出错的问题
2020/05/18 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
python 实现波浪滤镜特效
2020/12/02 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
艺术设计专业个人求职信范文
2013/12/11 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
团队激励口号
2014/06/06 职场文书
2014年财政所工作总结
2014/11/22 职场文书
2014年实习生工作总结
2014/11/27 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS