如何在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
相关产品推荐
相关产品推荐

