关于Django使用 django-celery-beat动态添加定时任务的方法

 更新时间:2021年10月22日 10:29:50   作者:以王姓自居  
本文给大家介绍Django使用 django-celery-beat动态添加定时任务的方法,安装对应的是celery版本,文中给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

版本信息

# 插件安装 
Django==2.2.2
django-celery-beat==2.1.0
django-redis==4.8.0
mysqlclient==2.0.0
django-mysql==3.2.0
redis==3.2.1
uWSGI==2.0.17.1
django-redis-cache==2.1.0

安装与配置

  1. 安装上面的对应的celery版本
  2. 配置settings.py
# django时区配置
TIME_ZONE = 'Asia/Shanghai'
# 如果USE_TZ设置为True时,Django会使用系统默认设置的时区,此时的TIME_ZONE不管有没有设置都不起作用
# 如果USE_TZ 设置为False,TIME_ZONE = 'Asia/Shanghai', 则使用上海的UTC时间。
USE_TZ = False

INSTALLED_APPS = (
    ...,
    'django_celery_beat',
)

# celery beat配置
# CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = TIME_ZONE
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_BEAT_SCHEDULER = 'django-celery-beat.schedulers.DatabaseScheduler'
# 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
# 设置代理人broker
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/2'
# 指定 Backend
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'

生成数据库

python manage.py migrate

# 迁移之后生成的表结构
django_celery_beat.models.PeriodicTask 此模型定义要运行的单个周期性任务。
django_celery_beat.models.IntervalSchedule 以特定间隔(例如,每5秒)运行的计划。
django_celery_beat.models.CrontabSchedule 与像在cron项领域的时间表 分钟小时日的一周 DAY_OF_MONTH month_of_year
django_celery_beat.models.PeriodicTasks 此模型仅用作索引以跟踪计划何时更改

在工作目录下配置celery.py

# -*- coding: utf-8 -*-
# @File:    celeryc.py
# @Content: celery定时任务配置


import os
from celery import Celery, platforms
from celery.schedules import crontab
from django.conf import settings

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_server.settings")
app = Celery("django_server")
app.config_from_object("django.conf:settings", namespace="CELERY")
# 定时任务的存放位置
app.autodiscover_tasks(["monitoring.tasks", "wechat.tasks"])

创建tasks任务

from celery import shared_task

@shared_task
def alarm_monitor_task(**kwargs):
  print("定时任务!!!")

创建定时任务

from django_celery_beat.models import PeriodicTask, IntervalSchedule

-----周期性任务
#  创建10分钟的间隔 interval 对象
schedule, _ = IntervalSchedule.objects.update_or_create(every=10, period=IntervalSchedule.MINUTES)
# 如果任务存在就更新,不存在则创建
PeriodicTask.objects.update_or_create(
  defaults={
    "interval": schedule,  # 上面创建10分钟的间隔 interval 对象
    "task": "monitoring.tasks.alarm_monitor_task",  # 指定需要周期性执行的任务
    "args"=json.dumps(['arg1', 'arg2']),
    "kwargs": json.dumps({"a": 1, "b": 2}, ensure_ascii=False)  # 传入的参数
  },
  name="定时任务-task",
)
# 周期性任务可选参数
IntervalSchedule.DAYS 固定间隔天数
IntervalSchedule.HOURS 固定间隔小时数
IntervalSchedule.MINUTES 固定间隔分钟数
IntervalSchedule.SECONDS 固定间隔秒数
IntervalSchedule.MICROSECONDS 固定间隔微秒


----Crontab 周期性任务
from django_celery_beat.models import CrontabSchedule, PeriodicTask
# 创建间隔30分钟执行的任务
crontab, _ = CrontabSchedule.objects.update_or_create(
  minute="*/30",
  hour="*",
  day_of_week="*",
  day_of_month='*',
  month_of_year='*',
  timezone=pytz.timezone("Asia/Shanghai"),
)
# 任务存在则更新,不存在创建
PeriodicTask.objects.update_or_create(
  name=task_name,
  defaults={
    "kwargs": json.dumps(kwargs, ensure_ascii=False),
    "task": "wechat.tasks.subscribe_task",
    "crontab": crontab,
  },
)

# 删除任务
task = PeriodicTask.objects.filter(name__startswith=sub_id)
if task:
    task.update(enabled=False)
    task.delete()
    
    
# 暂停当前任务
tasks = PeriodicTask.objects.filter(name__startswith=sub_id)
if tasks:
    tasks.update(enabled=True if status else False)

运行任务

# 启动任务 work
celery -A django_server worker -l INFO --logfile=/var/log/dec_server/worker.log

# 启动定时器触发 beat
celery -A django_server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler --logfile=/var/log/dec_server/beat.log

Tips:

参考链接:

https://github.com/celery/django-celery-beat

https://pypi.org/project/django-celery-beat/

到此这篇关于Django使用 django-celery-beat动态添加定时任务的文章就介绍到这了,更多相关django celery beat动态添加定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python练习之曾经很火的小人画爱心表白代码

    python练习之曾经很火的小人画爱心表白代码

    小编有个好兄弟最近在追妹子,跟妹子打得火热!就差临门一脚了,这一jio我帮忙补上去了!他问有没有什么酷炫的表白方式,可以给人心动的赶jio,表白的方式有许多种今天小编来教大家一个之前很火的小人画爱心表白代码
    2021-09-09
  • Python实现图数据处理的完整指南

    Python实现图数据处理的完整指南

    图是一种非常重要的数据结构,在Python中,我们可以使用邻接矩阵来表示图,这篇文章主要为大家介绍了Python实现图数据处理的相关知识,需要的可以参考下
    2024-04-04
  • python自动化之Ansible的安装教程

    python自动化之Ansible的安装教程

    这篇文章主要介绍了python自动化之Ansible的安装方法,结合实例形式分析了自动化运维工具Ansible的安装步骤及相关操作命令,需要的朋友可以参考下
    2019-06-06
  • python包装和授权学习教程

    python包装和授权学习教程

    包装是指对一个已经存在的对象进行系定义加工,实现授权是包装的一个特性,下面这篇文章主要给大家介绍了关于python包装和授权的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Pandas时间序列重采样(resample)方法中closed、label的作用详解

    Pandas时间序列重采样(resample)方法中closed、label的作用详解

    这篇文章主要介绍了Pandas时间序列重采样(resample)方法中closed、label的作用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • python过滤字符串中不属于指定集合中字符的类实例

    python过滤字符串中不属于指定集合中字符的类实例

    这篇文章主要介绍了python过滤字符串中不属于指定集合中字符的类,涉及Python针对字符串与集合的相关操作技巧,需要的朋友可以参考下
    2015-06-06
  • Python中无限元素列表的实现方法

    Python中无限元素列表的实现方法

    这篇文章主要介绍了Python中无限元素列表的实现方法,很实用的功能,需要的朋友可以参考下
    2014-08-08
  • Python3 维护有序列表bisect的使用

    Python3 维护有序列表bisect的使用

    Python3中的bisect模块提供了一种高效的方式来在有序列表中进行二分查找和插入操作,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • 基于Python 装饰器装饰类中的方法实例

    基于Python 装饰器装饰类中的方法实例

    下面小编就为大家分享一篇基于Python 装饰器装饰类中的方法实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python设计模式之装饰模式实例详解

    Python设计模式之装饰模式实例详解

    这篇文章主要介绍了Python设计模式之装饰模式,结合实例形式详细分析了装饰模式的概念、原理并结合Python实例形式分析了装饰模式的相关使用技巧,需要的朋友可以参考下
    2019-01-01

最新评论