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 相关文章推荐
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
Python爬虫利用cookie实现模拟登陆实例详解
Jan 12 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
python的turtle库使用详解
May 10 Python
使用python socket分发大文件的实现方法
Jul 08 Python
浅谈Python 敏感词过滤的实现
Aug 15 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
解决python便携版无法直接运行py文件的问题
Sep 01 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 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站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
jquery封装的对话框简单实现
2013/07/21 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
js实现时间日期校验
2020/05/26 Javascript
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
Python探索之Metaclass初步了解
2017/10/28 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
如何判断计算机可能已经中马
2013/03/22 面试题
创联软件面试题笔试题
2012/10/07 面试题
小加工厂管理制度
2014/01/21 职场文书
项目合作协议书范本
2014/04/16 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
社区节水倡议书
2015/04/29 职场文书
结婚典礼主持词
2015/06/29 职场文书
python munch库的使用解析
2021/05/25 Python