如何在Python循环中按不同时间间隔执行多个函数?
按固定间隔执行多函数的Python实现方案
你原来用循环计数器的方法问题在于依赖循环耗时固定,但实际函数执行时间不确定,导致间隔不准。正确的思路是基于实际时间戳判断是否执行函数,下面给两种适合新手的实现方法:
方法一:单线程时间差判断(简单易理解)
这种方法在单个循环里,通过记录每个函数上次执行的时间,每次检查当前时间与上次执行时间的差值是否达到设定间隔,达到就执行函数并更新时间戳。
import time def function1(): print("Running function1") def function2(): print("Running function2") def function3(): print("Running function3") def function4(): print("Running function4") def main(): # 初始化各函数的上次执行时间为当前时间 last_run1 = time.time() last_run2 = time.time() last_run3 = time.time() last_run4 = time.time() # 定义每个函数的执行间隔(单位:秒) interval1 = 1 interval2 = 2 interval3 = 5 interval4 = 10 while True: current_time = time.time() # 检查function1是否到执行时间 if current_time - last_run1 >= interval1: function1() last_run1 = current_time # 检查function2是否到执行时间 if current_time - last_run2 >= interval2: function2() last_run2 = current_time # 检查function3是否到执行时间 if current_time - last_run3 >= interval3: function3() last_run3 = current_time # 检查function4是否到执行时间 if current_time - last_run4 >= interval4: function4() last_run4 = current_time # 短暂休眠0.1秒,减少CPU空转消耗 time.sleep(0.1) if __name__ == "__main__": main()
优点:
- 逻辑简单,新手容易看懂和调试
- 不需要额外的多线程知识
- 能保证每个函数的执行间隔是从上次执行完成开始计算的
方法二:多线程并行执行(适合函数耗时较长的场景)
如果某个函数执行时间超过了它的间隔(比如function1要跑2秒,但间隔是1秒),单线程会导致后续函数的执行被延迟。这时可以给每个函数单独开线程,让它们各自按间隔执行,互不干扰。
import threading import time def function1(): while True: print("Running function1") time.sleep(1) def function2(): while True: print("Running function2") time.sleep(2) def function3(): while True: print("Running function3") time.sleep(5) def function4(): while True: print("Running function4") time.sleep(10) def main(): # 创建线程,daemon=True表示线程随主线程退出而终止 t1 = threading.Thread(target=function1, daemon=True) t2 = threading.Thread(target=function2, daemon=True) t3 = threading.Thread(target=function3, daemon=True) t4 = threading.Thread(target=function4, daemon=True) # 启动所有线程 t1.start() t2.start() t3.start() t4.start() # 主线程保持运行,防止程序退出 while True: time.sleep(1) if __name__ == "__main__": main()
优点:
- 各函数独立执行,互不影响间隔
- 适合函数执行时间不确定或较长的场景
总结
- 新手先从方法一开始,理解时间戳判断的核心逻辑
- 如果需要并行执行、避免函数间相互阻塞,再用方法二的多线程方案
内容的提问来源于stack exchange,提问作者Gnad
相关产品推荐
相关产品推荐

