Django框架使用定时器-APScheduler实现定时任务:django实现简单的定时任务

一、系统环境依赖

系统:windows10

python: python==3.9.0

djnago==3.2.0

APScheduler==3.10.1

二、django项目配置

1、创建utils包,在包里面创建schedulers包

utils/schedulers/task.py

python 复制代码
#1、设置 Django 环境,就可以导入项目的模型类这些了
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目根目录名.settings")
import django
django.setup()
#2、一些需要的模块
from datetime import datetime,timedelta,date

#3、django项目中模型类


NOW_DATETIME = datetime.strftime(datetime.now(),'%Y-%m-%d %H:%M:%S')
NOW_DATE = date.today().strftime('%Y-%m-%d')

def example_interval():
    '''
    每隔一段固定时间就执行一次
    :return:
    '''
    print('interval',NOW_DATETIME)

def example_cron():
    '''
    在每天的固定时间执行
    :return:
    '''
    print('cron,凌晨开始执行的定时任务')

def example_date():
    '''
    在指定日期执行一次,就执行一次
    :return:
    '''
    print(f'date,指定日期执行一次:{NOW_DATETIME}')

utils/schedulers/scheduler.py

python 复制代码
# 2、导入所需的调度器类和触发器类
from apscheduler.jobstores.memory import MemoryJobStore
from apscheduler.jobstores.redis import RedisJobStore
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger
from apscheduler.triggers.cron import CronTrigger
from apscheduler.triggers.date import DateTrigger
from pytz import timezone
from threading import RLock
from django.conf import settings
from datetime import datetime,timedelta
lock = RLock()

#3、导入定时任务
from .task import example_interval   #例子,时间间隔,每隔一段时间执行
from .task import example_cron  #指定时间执行,在指定时间点执行
from .task import example_date #指定日期执行,执行一次


class __SchedulerManage(BackgroundScheduler):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance:
            return cls._instance
        with lock:
            if cls._instance:
               return cls._instance
            cls._instance = super().__new__(cls)
            return cls._instance

    def __init__(self):
        super().__init__()
        # 1、设置时区
        self.timezone = timezone(settings.TIME_ZONE)
        # 2、使用内存存储定时任务信息
        jobstore_redis = RedisJobStore(host='localhost', port=6379, db=0, password='redis密码')
        jobstore_memory = MemoryJobStore()
        self.add_jobstore(jobstore_memory)
        # 3、添加任务
        self.add_task()

    def add_task(self):
        '''
        自定义的功能: 用来添加定时任务的
        :return:
        '''
        '1、三种触发器的例子'
        #每隔一段固定时间段执行一次,1小时执行一次,设置开始时间是启动时间后的3分钟
        self.add_job(example_interval, trigger=IntervalTrigger(hours=1,start_date=datetime.now()+timedelta(minutes=3)), id='example_interval', replace_existing=True)
        #设置每天的11:03:10 执行一次
        self.add_job(example_cron,trigger=CronTrigger(hour=11,minute=3,second=10),id='example_cron',replace_existing=True)
        #设置在2023-08-10 11:03:01执行一次,只执行一次
        self.add_job(example_date,trigger=DateTrigger(run_date=datetime(2023,8,10,11,3,1)),id='example_date',replace_existing=True)
       

#也可以在实例化时设置时区:__SchedulerManage(timezone=timezone('Asia/Shanghai'))
scheduler_ = __SchedulerManage()
if __name__ == '__main__':
    #启动 scheduler_.start()  或者 scheduler_() 两种方式都ok
    scheduler_()

utils/schedulers/init.py

python 复制代码
from .scheduler import scheduler_

2、项目配置文件settings.py

python 复制代码
####配置定时任务
#启动定时任务
from utils.schedulers import scheduler_
scheduler_.start()
相关推荐
广州灵眸科技有限公司6 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手9 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学9 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh11 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898612 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD12 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo12 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
Ai_easygo13 小时前
MCP 协议实战:用 Claude Desktop 连本地 SQLite,5 分钟搭一个能查数据的 AI 助手
jvm·人工智能·sqlite
TlSfoward13 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记14 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘