Python Schedule库未按预期调度方法问题排查
问题分析与解决
问题描述
我用以下代码实现任务调度,希望sayHello方法每天在EST时间1:53执行一次:
def sayHello(self): print(f"hello {datetime.datetime.now()}") def schedule_job(self): print(f"schedules jobs") schedule.every().day.at("02:18", "US/Eastern").do(self.sayHello) while True: schedule.run_pending() print("Scheduled jobs:", schedule.jobs) time.sleep(1)
运行后发现程序一直循环打印调度任务信息,误以为sayHello在重复调用,但实际上它只执行了一次。运行输出如下:
schedules jobs hello 2023-07-06 00:18:09.949960 Scheduled jobs: [Every 1 day at 02:18:00 do sayHello() (last run: 2023-07-06 00:18:09, next run: 2023-07-06 23:18:00)] Scheduled jobs: [Every 1 day at 02:18:00 do sayHello() (last run: 2023-07-06 00:18:09, next run: 2023-07-06 23:18:00)] ...
问题根源
- 循环内的冗余打印:你把
print("Scheduled jobs:", schedule.jobs)放在了while True的循环体里,每次循环都会执行这个打印,所以会持续输出任务列表——这和sayHello的执行完全无关,只是循环本身的重复操作。 - 时间配置与期望不符:代码里设置的执行时间是EST 02:18,但你期望的是1:53,这里时间参数写错了。
- 时区显示混乱:
datetime.datetime.now()输出的是本地时区时间(从输出看是UTC-4,和EST的UTC-5差1小时),导致你看到的执行时间和设置的EST时间有偏差,容易产生误解。
解决办法
- 移除循环内的打印:如果不需要实时监控任务状态,直接删掉循环里的
print("Scheduled jobs:", schedule.jobs);如果需要监控,也可以改成只在任务执行时打印,或者降低打印频率。 - 修正执行时间:把
at("02:18", "US/Eastern")改成at("01:53", "US/Eastern"),匹配你的需求。 - 统一时区输出:在
sayHello里输出EST时区的时间,避免混淆,示例如下:def sayHello(self): print(f"hello {datetime.datetime.now(pytz.timezone('US/Eastern'))}")
修正后的完整示例代码:
import schedule import time import datetime import pytz class JobScheduler: def sayHello(self): # 输出EST时区的时间 print(f"hello {datetime.datetime.now(pytz.timezone('US/Eastern'))}") def schedule_job(self): print("schedules jobs") # 设置为期望的EST时间1:53 schedule.every().day.at("01:53", "US/Eastern").do(self.sayHello) while True: schedule.run_pending() # 可选:保留打印但延长休眠时间,减少输出频率 # print("Scheduled jobs:", schedule.jobs) time.sleep(60) # 改为60秒检查一次,比1秒更高效
内容的提问来源于stack exchange,提问作者user93796
相关产品推荐
相关产品推荐

