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当中的数据类型和变量
Apr 25 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
python实时获取外部程序输出结果的方法
Jan 12 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
打包python 加icon 去掉cmd黑窗口方法
Jun 24 Python
Python Django基础二之URL路由系统
Jul 18 Python
使用python写一个自动浏览文章的脚本实例
Dec 05 Python
pytorch查看模型weight与grad方式
Jun 24 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 Python
python+flask编写一个简单的登录接口
Nov 13 Python
使用python如何删除同一文件夹下相似的图片
May 07 Python
golang特有程序结构入门教程
Jun 02 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学习笔记之面向对象编程
2012/12/29 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
javascript 闭包疑问
2010/12/30 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
Python中使用HTMLParser解析html实例
2015/02/08 Python
解析Python中的二进制位运算符
2015/05/13 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
教师党员公开承诺书
2014/03/25 职场文书
难忘的一课教学反思
2014/04/30 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
意向协议书
2015/01/27 职场文书
避暑山庄导游词
2015/02/04 职场文书
导游词之台湾阿里山
2019/10/23 职场文书
详解如何用Python实现感知器算法
2021/06/18 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python