【Python】Django-动态创建定时任务

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

在使用python的Django框架时,可以使用celery工具来定性定时任务的创建。可以帮助我们实现很多计划性任务。
某些情况下,我们会想要需要根据我们的函数传参实现动态生成定时任务,这是我们就可以使用第三方库django-celery-beat、django-celery-results来实现。示例以来Python的Django框架。


提示:以下是本篇文章正文内容,下面案例可供参考

一、定时任务原理

在我们使用django-celery-beat创建任务时,在启用celery-worker时(python manage.py celery worker -l info) 会在我们的数据库中生成记录信息。记录任务的时间与函数方法。
例如:
在这里插入图片描述
在创建任务完成后,celery会遍历数据表内容,django_celery_beat_periodictask记录创建的任务信息,django_celery_beat_crontabschedule、django_celery_beat_intervalschedule记录任务时间维度。

二、使用步骤

1.安装库

初始化框架时,将celery信息存入requirements.txt

Django==2.2.6
celery==4.4.0
django-celery-beat==2.0.0
django-celery-results==1.2.1

运行 pip install -r requirements.txt
进行数据库迁移
python manage.py migrate

2.创建任务

代码如下(示例):

import logging
from celery.task import periodic_task
from celery.schedules import crontab
from django_celery_beat.models import PeriodicTask,IntervalSchedule,CrontabSchedule
from django.utils import timezone
logger = logging.getLogger('root')

@periodic_task(run_every=crontab(minute='0', hour='0'))   # 每天凌晨开始执行定时任务
def operation_strategy_bkjob():
	# work_time 自定-此示例用来指明任务时间 
    work_time = [["04:00:00","04:00:00"],["20:00:00","20:00:00"],["11:10:00","16:00:00"]]
    for time_ in work_time:
        enter_time = time_[0]
        enter_time_hour = int(enter_time.split('-')[0])
        enter_time_minute = int(enter_time.split('-')[1])
        end_time = time_[-1]
        end_time_hour = int(end_time.split('-')[0])
        end_time_minute = int(end_time.split('-')[-1])
        # 创建当天的定时任务(开始)
        bool_enter_task,enter_task_name = enter_task(enter_time_hour,enter_time_minute,task_info='homen_application.views.operation_task',strategy_id=strategy_id,enabled=True,strategy_name=strategy_object.name)
        if bool_enter_task == False:
            logger.error("<创建任务失败>[}".format(enter_task_name))
        # 创建当天的定时任务(结束)
        bool_stop_task,stop_task_name = enter_task(end_time_hour,end_time_minute,task_info='homen_application.views.operation_task',strategy_id=strategy_id,enabled=False,strategy_name=strategy_object.name)
        if bool_stop_task == False:
            logger.error("<停止任务失败>[}".format(stop_task_name))
	logger.info('<---{}:创建作业平台当天定时任务完成--->'.format(today_str))


def enter_task(hour_,minute_,task_info,strategy_id,strategy_name, enabled,**kwargs):
    """创建定时任务"""
    try:
        task_name= strategy_name + "-" + hour_ + "-" + minute_
        # 定时任务的时间
        crontab, _ = CrontabSchedule.objects.update_or_create(
            minute=minute_,
            hour=hour_,
            day_of_week="*",
            day_of_month='*',
            month_of_year='*',
            timezone=timezone.get_current_timezone(), # 一定要加上市区设置,应为默认是UTC时间。
        )
        # 定时任务信息
        PeriodicTask.objects.update_or_create(
            defaults={
            "crontab": crontab,  # 使用的时间维度,即什么时间执行这个任务
            "task": task_info,  # 任务用到的函数方法
            # "args":json.dumps([strategy_id, enabled]),
            "kwargs": json.dumps({"strategy_id":strategy_id, "enabled":enabled}, ensure_ascii=False) # 传入的参数
            },
            name=task_name, # 任务名称
        )
        return True,task_name
    except Exception as e:
        logger.error('<---创建定时任务失败--->{}'.format(e))
        return False,str(e)

该代码片段可实现在每天00:00:00进行任务创建,任务执行时间有参数work_time控制,任务使用方法的参数由 enter_task 中args与kwargs控制。

3.停止、删除任务操作

def stop_task(hour_,minute_,task_info,is_delete,**kwargs):
    """终止定时任务"""
    try:
        # 定位任务
        tasks = PeriodicTask.objects.filter(name=task_info)
        # 停止任务
        if tasks:
            tasks.update(enabled=False)
            # 删除任务
            if is_delete:
                tasks.delete()
        return True,'success'
    except Exception as e:
        return False,str(e)

总结

以上为对第三方库django-celery-beat2.0.0
django-celery-results
1.2.1的一个简单实用记录。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值