如何在指定时间(如上午10点、11点)执行函数或触发按钮点击
精准定点执行函数实现方案
你现有的两段代码分别是固定延时、时间段判断逻辑,都无法满足精准触发固定时间点的需求,可参考以下实现:
实现逻辑
- 先预定义所有需要触发的时间点,转换为datetime对象方便计算时间差
- 每次计算距离当前时间最近的下一个触发时间
- 如果距离触发时间大于0,就等待对应时长,到期后直接执行目标函数
- 支持跨天场景,若当天所有触发时间都已过,自动计算到次日第一个触发点的等待时间
完整代码示例
import datetime import time def run_at_fixed_time(target_times: list, func, *args, **kwargs): """ 精准在指定时间点执行函数 :param target_times: 触发时间列表,格式为["%H:%M:%S"],比如["10:00:00", "11:00:00"] :param func: 要执行的目标函数 :param args: 目标函数的位置参数 :param kwargs: 目标函数的关键字参数 """ time_format = "%H:%M:%S" # 转换所有触发时间为time对象 target_time_objs = [datetime.datetime.strptime(t, time_format).time() for t in target_times] # 按时间先后排序 target_time_objs.sort() while True: now = datetime.datetime.now() now_time = now.time() next_run = None # 找今天内还没到的最近触发时间 for t in target_time_objs: if t >= now_time: next_run = datetime.datetime.combine(now.date(), t) break # 今天的都过了,取明天第一个触发时间 if not next_run: next_run = datetime.datetime.combine(now.date() + datetime.timedelta(days=1), target_time_objs[0]) # 计算需要等待的秒数 wait_seconds = (next_run - now).total_seconds() if wait_seconds > 0: # 未到时间就等待 time.sleep(wait_seconds) # 到时间直接执行函数 func(*args, **kwargs) # 测试用例:定义你要执行的函数 def your_function(): print(f"函数在 {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 执行") # 调用入口,指定10点、11点执行 if __name__ == "__main__": run_at_fixed_time(["10:00:00", "11:00:00"], your_function)
精度调整说明
正常情况下上述代码误差在10ms以内,完全满足普通业务场景的精度需求。如果需要更高精度,可以把sleep逻辑替换为小步长轮询,避免系统调度带来的误差:
# 高精度等待逻辑,替换原time.sleep(wait_seconds)即可 while (datetime.datetime.now() < next_run): time.sleep(0.001)
内容的提问来源于stack exchange,提问作者jay kishan
相关产品推荐
相关产品推荐

