如何使用Python schedule库高效实现工作日特定时段定时任务?
高效实现周一至周五指定时段每小时执行任务
嘿,重复写那么多调度行确实太冗余了!完全没必要这么麻烦,我们可以利用Python的循环特性,轻松简化这段代码,同时保持功能完全一致。
最优解决方案代码
import schedule import time def job(): # 用with语句自动管理文件,比手动close更安全简洁 with open('model.py') as f: exec(f.read()) # 定义需要执行任务的工作日(对应schedule库的方法名) weekdays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'] # 生成11:00到18:00的所有整点时间字符串 hours = [f"{hour}:00" for hour in range(11, 19)] # range(11,19)覆盖11到18点 # 批量注册所有调度任务 for day in weekdays: for hour in hours: # 动态获取星期几的调度方法,等价于schedule.every().monday这种写法 getattr(schedule.every(), day).at(hour).do(job) while True: schedule.run_pending() time.sleep(1)
代码细节解释
- 批量遍历工作日:
weekdays列表里的字符串和schedule库提供的星期方法名完全对应,用getattr可以动态调用这些方法,避免写重复的.monday、.tuesday代码。 - 自动生成时段:用列表推导式快速生成11:00到18:00的所有整点时间,后续要调整时段的话,只需要修改
range的参数就行(比如改成range(9,18)就是9点到17点)。 - 文件操作优化:把原来的
open/try/finally换成with语句,Python会在代码块结束后自动关闭文件,既减少代码量又避免忘记关闭文件的问题。
备选方案(按需选择)
如果你的场景允许稍微灵活一点的调度,也可以用“每小时执行一次,但仅在符合条件的时段运行任务”的方式,不过这种方式会每小时触发一次判断,不如上面的批量注册精准:
import schedule import time from datetime import datetime def job(): with open('model.py') as f: exec(f.read()) def is_valid_time(): now = datetime.now() # 周一到周五(weekday()返回0=周一,4=周五),且小时在11到17之间(因为18点执行完就到下一小时了) return 0 <= now.weekday() <= 4 and 11 <= now.hour < 18 # 每小时执行一次,但只在符合条件时运行job schedule.every().hour.do(lambda: job() if is_valid_time() else None) while True: schedule.run_pending() time.sleep(1)
第一种方案更推荐,因为它直接把所有需要执行的整点任务提前注册到调度器里,触发更精准,也不需要额外的时间判断逻辑。
内容的提问来源于stack exchange,提问作者orie




