You need to enable JavaScript to run this app. Python schedule定时任务不执行,删除schedule.clear()后任务重复如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Python schedule定时任务不执行,删除schedule.clear()后任务重复如何解决?

问题原因分析

1. 定时任务不执行的根本原因

  • schedule.clear() 被放在了死循环的最开始位置,每次循环都会先清空所有已创建的定时任务,再重新从配置文件读取规则生成全新的任务实例
  • schedule库创建每日定点任务时,若当前系统时间已经超过了设定的触发时间,新任务会自动将首次执行时间设置为次日的对应时间。你每次循环都销毁旧任务重建新任务,就会导致刚过设定时间的任务永远被推后到第二天,永远不会触发
  • 旧任务存储的上次运行时间、待执行标记等状态都会随着清空操作丢失,即便是还没错过执行窗口的任务,重建后也会丢失触发时机

2. 删除schedule.clear()后任务重复的原因

删除清空操作后,每次循环都会重新读取配置并添加一遍完全相同的定时任务,同一个时间点的任务会被累加N个,到达触发时间后N个任务会依次执行,就出现了重复触发的问题。

修复方案

你可以选择两种方案解决问题:

  • 方案1:仅在配置文件发生变更时,才清空旧任务、重新加载新任务,避免每次循环都重复操作
  • 方案2:每次添加任务前先校验相同规则的任务是否已存在,不存在再新增

以下是方案1的参考实现:

import json
import schedule
import time
import os

def greet(name):
    print('Hello', name)

# 记录配置文件的最后修改时间,用来判断配置是否更新
last_mtime = 0

while True:
    # 读取配置文件的最后修改时间
    current_mtime = os.path.getmtime("config.json")
    # 只有配置发生变更时才更新任务列表
    if current_mtime != last_mtime:
        schedule.clear()
        with open("config.json") as config:
            data = json.load(config)
        if data["start"]:
            date = data["time"]          
            for i in date:
                schedule.every().day.at(i).do(greet, name=data["name"])  
        # 更新修改时间标记
        last_mtime = current_mtime
    
    all_jobs = schedule.get_jobs()
    print(all_jobs)
    schedule.run_pending()
    time.sleep(1)

内容的提问来源于stack exchange,提问作者stiil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 04:15:03