apscheduler

python 复制代码
from apscheduler.schedulers.background import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import time
from apscheduler.triggers.interval import IntervalTrigger
from config.config_util import get_yaml_cfg_by_key
from tools import db_util
from tools.logger_util import logger
from tools.request_util import trigger_batch

db_cfg = get_yaml_cfg_by_key("check_db")


class TaskScheduler:
    def __init__(self):
        self.scheduler = BlockingScheduler()
        self.job = None

    def get_scheduler_cfg(self, config_id):
        sql = f"select config_value from cmap_qc_config where config_id = '{config_id}' "
        one = db_util.fetch_pg(db_cfg, sql, fetchall=False)
        cron_expression, is_enabled = one[0]['cron_expression'], one[0]['enabled']
        return cron_expression, bool(is_enabled)

    def start_or_update_task(self, config_id):
        cron_expression, enabled = self.get_scheduler_cfg(config_id)
        if enabled:
            cron_trigger = CronTrigger.from_crontab(cron_expression)
            if self.job:
                if self.job.trigger.fields != cron_trigger.fields:
                    self.job.remove()
                    self.job = self.scheduler.add_job(self.pdb_check, trigger=cron_trigger)
                    logger.info(f"任务已更新,新的 cron 表达式为:{cron_expression}")
                else:
                    logger.info(f"不需要更新,新的 cron 表达式为:{cron_expression}")
            else:
                self.job = self.scheduler.add_job(self.pdb_check, trigger=cron_trigger)
                logger.info(f"任务已启动,cron 表达式为:{cron_expression}")
            logger.info(f"{self.job.next_run_time=}")
        else:
            if self.job:
                self.job.remove()
                self.job = None
                logger.info("任务已停止。")
            else:
                logger.info("任务未启动,数据库配置为禁用。")

    def pdb_check(self):
        logger.info(f"任务正在执行,当前时间:{time.strftime('%Y-%m-%d %H:%M:%S')}")
        trigger_batch_res = trigger_batch()
        logger.info(f"{trigger_batch_res=}")

    def shutdown(self):
        self.scheduler.shutdown(wait=False)
        logger.info("调度器已关闭。")


def start_scheduler():
    task_scheduler = TaskScheduler()
    # task_scheduler.scheduler.add_job(task_scheduler.start_or_update_task, args=["pdb_check_scheduler"],
    #                                  trigger=CronTrigger(second="*/5"))
    # task_scheduler.scheduler.add_job(task_scheduler.start_or_update_task, args=["pdb_check_scheduler"],
    #                                  trigger=IntervalTrigger(minutes=1))
    task_scheduler.scheduler.add_job(task_scheduler.start_or_update_task, args=["pdb_check_scheduler"],
                                     trigger=IntervalTrigger(minutes=30))
    logger.info("starting....")
    task_scheduler.scheduler.start()
    # try:
    #     # print("调度器已启动,按 Ctrl+C 退出。")
    #     while True:
    #         time.sleep(10)
    # except KeyboardInterrupt:
    #     task_scheduler.shutdown()


# 测试代码
if __name__ == "__main__":
    start_scheduler()
相关推荐
潜创微科技几秒前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
Escalating_xu23 分钟前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
步行cgn28 分钟前
Spring 注入 Map 集合详解
数据库·python·spring
傲世仙尊29 分钟前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
今儿敲了吗32 分钟前
03停用词过滤
笔记·python
cvby1 小时前
C++11
开发语言·c++
李可以量化1 小时前
Tornado 部署公域网络安全与防护(上)
python
风跟我说过她1 小时前
SQL 一键转经典 Chen 风格 ER 图:开源 CLI + 在线工具 + Agent Skill
数据库·python·sql·开源·开源软件
Ulyanov2 小时前
AudioVision Pro:基于 PySide6 + sounddevice 的实时音频可视化播放器设计
python·算法·音视频
ID34610744202 小时前
【课程设计】基于Spring Boot+Vue的校园共享无人机服务系统设计与实现-计算机毕设 附源码44219
javascript·vue.js·spring boot·python·node.js·php·课程设计