You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现工作日特定时间定时任务仅执行一次?

解决Python定时任务重复执行的问题

你的代码核心问题是while循环每10秒就会重复添加定时任务,每次调用schedule.every().day.at("时间").do(函数)都会创建一个新的定时任务,到指定时间后所有被添加的任务都会执行,导致重复输出。同时每次循环都读取Excel文件也会造成不必要的性能损耗,需要优化。

解决方案

  • 用变量标记当天的任务是否已经添加,避免重复创建任务
  • 每天只读取一次Excel日历,减少IO操作
  • 调整循环逻辑,仅在当天是工作日且未添加任务时,一次性添加所有定时任务

修改后的代码

import pandas as pd
from datetime import datetime
import time
import schedule 

def test_1():
    print("do task 1")

def test_2():
    print("do task 2")

# 初始化变量:记录当天是否已添加任务,以及当前日期
tasks_added_today = False
current_date = ""

while True:
    today = datetime.today().strftime('%Y/%m/%d')
    
    # 仅当天日期变化时,重新读取Excel并重置任务标记
    if today != current_date:
        current_date = today
        tasks_added_today = False
        # 读取日历文件
        df_Calender = pd.read_excel('Calender.xlsx', sheet_name=0) 
        # 筛选当天的记录
        df1_Calender = df_Calender[df_Calender['Date'] == today]
        # 判断是否为工作日
        is_workday = df1_Calender['WeekDays'].item() == 1 if not df1_Calender.empty else False
    
    if not is_workday:
        print("do nothing")
    else:
        # 仅在任务未添加时,一次性添加定时任务
        if not tasks_added_today:
            schedule.every().day.at("11:02").do(test_1)
            schedule.every().day.at("11:03").do(test_2)
            tasks_added_today = True
            print("今日任务已添加")
    
    # 检查并执行待处理任务
    schedule.run_pending()
    time.sleep(10)

关键改动说明

  • tasks_added_today变量:标记当天是否已添加任务,避免重复调用schedule添加任务
  • current_date变量:跟踪当前日期,仅日期变化时重新读取Excel,避免每次循环都读文件
  • 调整任务添加逻辑:只有当天是工作日且任务未添加时,才执行一次任务添加操作
  • 把schedule.run_pending()移到sleep之前,保证每次循环都先检查任务,再等待

这样修改后,每天只会添加一次定时任务,到指定时间后每个任务只会执行一次,同时也优化了Excel读取的性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:30:33