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

版本信息

# 插件安装
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动态添加定时任务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解django中使用定时任务的方法

    今天介绍在django中使用定时任务的两种方式. 方式一: APScheduler 1)安装: pip install apscheduler 2)使用: from apscheduler.scheduler import Scheduler from django.core.cache import cache # 实例化 sched = Scheduler() # 每30秒执行一次 @sched.interval_schedule(seconds=30) def sched_test():

  • 使用django-crontab实现定时任务的示例

    今天打算在自己的 Django 应用中添加一个定时任务来定时执行一些定期检查的功能,因此想到了使用 django-crontab 插件可以满足我的需求,下面就是这个插件的使用方法. 首先使用pip安装 django-crontab 插件 pip install django-crontab 创建要定期执行的脚本和方法,这里假设脚本名称叫cron.py,内容如下: #!/usr/bin/env python # -*- coding: utf-8 -*- def check(): print "h

  • django使用django-apscheduler 实现定时任务的例子

    下载: pip install apscheduler pip install django-apscheduler 将 django-apscheduler 加到项目中settings的INSTALLED_APPS中 INSTALLED_APPS = [ .... 'django_apscheduler', ] 然后迁移文件后 ./manage.py migrate 生成两个表:django_apscheduler_djangojob 和 django_apscheduler_djangojo

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

    前期准备 1.beat插件安装 pip3 install django-celery-beat 2.注册APP INSTALLED_APPS = [ .... 'django_celery_beat', ] 3.数据库变更 python3 manage.py migrate django_celery_beat 配置工作 目录结构请参考://www.jb51.net/article/200659.htm 1.配置celerypro.py from __future__ import absolu

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

    版本信息 # 插件安装 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 安装与配置 安装上面的对应的celery版本 配置settings.py # django时区配置 TIME_ZONE = 'Asia/Shanghai' # 如果US

  • Django+Celery实现动态配置定时任务的方法示例

    哈喽,今天给大家分享一篇Django+Celery实现动态配置定时任务,因为最近也是无意间看到一位大佬关于这块的文章,然后自己觉得不错,也想学习写一下,然后最终实现功能是在前端页面统一管理计划任务,大家可以在admin管理页面设置,也可以在自己写的前端页面删除添加编辑,实时生效,还可以监控这些监控任务是否运行成功失败. 补充:如果大家对celery不熟悉的话,建议先学习celery 一.安装 1.在Linux系统上安装模块 celery (3.1.26.post2) celery-with-re

  • celery实现动态设置定时任务

    本文实例为大家分享了celery动态设置定时任务的具体代码,供大家参考,具体内容如下 首先celery是一种异步任务队列,如果还不熟悉这个开源软件的请先看看官方文档,快速入门. 这里讲的动态设置定时任务的方法不使用数据库保存定时任务的信息,所以是项目重启后定时任务配置就会丢失,如果想保存成永久配置,可以考虑保存到数据库.redis或者使用pickle.json保存成文件,在项目启动时自动载入. 方法原理介绍 先来看一下celery的beat运行过程. 上图是beat的主要组成结构,beat中包含

  • Python Celery动态添加定时任务生产实践指南

    目录 一.背景 二.Celery动态添加定时任务的官方文档 三.celery简单实用 3.1 基础环境配置 3.2 测试使用Celery应用 四.配置backend存储任务执行结果 四.优化Celery目录结构 五.开始使用django-celery-beat调度器 六.具体操作演练 6.1 创建基于间隔时间的周期性任务 6.2 创建一个不带参数的周期性间隔任务 6.3 周期性任务的查询.删除操作 总结 一.背景 实际工作中会有一些耗时的异步任务需要使用定时调度,比如发送邮件,拉取数据,执行定时

  • AngularJS实现动态添加Option的方法

    本文实例讲述了AngularJS实现动态添加Option的方法.分享给大家供大家参考,具体如下: 项目中后台管理设置,前台下拉动态添加option <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge&q

  • JS实现为表格动态添加标题的方法

    本文实例讲述了JS实现为表格动态添加标题的方法.分享给大家供大家参考.具体如下: JS中的表格对象带有一个createCaption方法用于为表格创建标题caption <!DOCTYPE html> <html> <head> <script> function createCaption() { var x=document.getElementById('myTable').createCaption(); x.innerHTML="My t

  • asp.net为网页动态添加关键词的方法

    本文实例讲述了asp.net为网页动态添加关键词的方法.分享给大家供大家参考.具体如下: 这段代码可以修改网页的keyword meta HtmlMeta keywords = new HtmlMeta(); keywords.Name = "keywords"; keywords.Content = "关键词"; Page.Header.Controls.Add(keywords); 希望本文所述对大家的asp.net程序设计有所帮助.

  • JavaScript动态添加列的方法

    本文实例讲述了JavaScript动态添加列的方法.分享给大家供大家参考.具体实现方法如下: /*** * 动态添加table 列 * @param result */ function addRow(resultJson){ /* var temp = []; temp = $.grep(arr, function(val, key) { if(val.indexOf('c') != -1) return true; // 如果[invert]参数不给或为false, $.grep只收集回调函

  • 给Ajax返回的HTML标签动态添加样式的方法

    今天在做项目时,在页面中用ajax返回了另一个页面,突然发现返回页面中的表格把页面给顶了出去,经过一番研究,终于解决了. 先准备好要返回内容的容器 <div class="container"> </div> 预定义一个样式,以便返回的内容能直接套用 比如,我们希望返回的表格不会太过分,把页面给顶开了... <style> .container table{ width:100%; } </style> 最后直接在容器中用ajax返回内容

  • JS实现给对象动态添加属性的方法

    本文实例讲述了JS实现给对象动态添加属性的方法.分享给大家供大家参考,具体如下: 在工作用要用到给jd对象动态添加属性的要求,在网上找到了一种解决方式,实例如下: 1.demo var aa="maker"; var bb=123; var lists={}; eval("lists."+aa+"="+bb); eval('('+"lists."+aa+"="+bb+')'); console.log(li

随机推荐