如何用Python Schedule库在指定时段准点每分钟执行任务?
Python Schedule库实现指定时段内准点每分钟执行任务
要实现仅在指定时段内执行准点任务,核心思路是在任务触发时先检查当前时间是否在目标时段内,符合条件才执行实际业务逻辑。Schedule库本身没有直接的时段过滤API,我们可以通过包装任务函数来实现需求,具体有两种实用方式:
方式一:直接在任务函数内添加时间判断
这种方式简单直接,适合单次使用的场景:
import schedule import datetime import time # 定义实际要执行的任务 def actual_job(): print(f"[{datetime.datetime.now()}] 执行任务") # 定义带时段检查的调度任务 def scheduled_job(): current_time = datetime.datetime.now().time() # 设置允许执行的时段:10:00 至 11:00 start_time = datetime.time(10, 0) end_time = datetime.time(11, 0) # 仅在时段内执行实际任务 if start_time <= current_time <= end_time: actual_job() # 保持原有的准点每分钟触发逻辑 schedule.every(1).minutes.at(":00").do(scheduled_job) # 启动调度循环 while True: schedule.run_pending() time.sleep(1)
方式二:用装饰器封装时段检查逻辑
如果需要给多个任务添加时段限制,装饰器的方式更优雅、复用性更强:
import schedule import datetime import time # 定义时段检查装饰器 def run_only_between(start_hour, start_minute, end_hour, end_minute): def decorator(func): def wrapper(): current_time = datetime.datetime.now().time() start = datetime.time(start_hour, start_minute) end = datetime.time(end_hour, end_minute) if start <= current_time <= end: return func() return wrapper return decorator # 用装饰器标记允许执行的时段 @run_only_between(10, 0, 11, 0) def actual_job(): print(f"[{datetime.datetime.now()}] 执行任务") # 原准点触发逻辑不变 schedule.every(1).minutes.at(":00").do(actual_job) # 启动调度循环 while True: schedule.run_pending() time.sleep(1)
说明
- 两种方式都保留了你原有的准点每分钟触发逻辑(程序启动后等待到下一分钟00秒执行),只是在触发时增加了时段校验。
- 时段判断基于系统当前本地时间,如果需要使用UTC时间,可将
datetime.datetime.now()替换为datetime.datetime.utcnow()。
内容的提问来源于stack exchange,提问作者mv1999
相关产品推荐
相关产品推荐

