Python如何每间隔指定秒数交替循环执行两个函数
实现两个函数按固定时长交替执行的解决方案
你之前的方案出错原因如下:
- 直接用
time.sleep()是放在函数调用之后,会等函数完整执行完才休眠,达不到控制函数运行时长的效果 - 用多线程/asyncio时出现同时执行,是因为你没有等待前一个任务到点终止就启动了下一个任务,调整执行逻辑即可解决
方案1:函数可修改为增量执行(最推荐,无资源泄漏风险)
如果你的函数逻辑可以拆分为单次短执行的小步骤,不需要持续阻塞,用单线程时间窗口控制即可:
import time def function1_step(): # 替换为你的单次执行逻辑,不要写死循环,每次调用完成一小段操作就返回 print("function1 运行中") def function2_step(): # 替换为你的单次执行逻辑 print("function2 运行中") while True: # 执行function1满5秒 start_at = time.time() while time.time() - start_at < 5: function1_step() # 若CPU占用过高可添加短休眠降低负载:time.sleep(0.01) # 执行function2满3秒 start_at = time.time() while time.time() - start_at < 3: function2_step() # 同理可加短休眠
方案2:函数为不可修改的阻塞逻辑,用多线程超时控制
如果你的函数本身是已经写好的阻塞逻辑(内置死循环/长时运算),可以用守护线程加超时等待的方式实现,保证两个函数不会同时执行:
import time import threading def function1(): # 你的原有function1逻辑,不需要修改 while True: print("function1 运行中") time.sleep(0.5) def function2(): # 你的原有function2逻辑,不需要修改 while True: print("function2 运行中") time.sleep(0.5) def run_func_with_timeout(func, timeout): # 启动守护线程,主逻辑退出时线程会自动终止 task = threading.Thread(target=func, daemon=True) task.start() # 阻塞等待固定时长,到点后才会往下执行 task.join(timeout) while True: run_func_with_timeout(function1, 5) run_func_with_timeout(function2, 3)
注意:如果函数内有打开文件、数据库连接等需要手动释放的资源,守护线程强制终止可能导致资源泄漏,优先选择方案1。
方案3:asyncio异步场景实现
如果你的函数是异步函数,按顺序等待超时任务即可,不会出现同时执行的问题:
import asyncio async def function1(): # 你的异步function1逻辑 while True: print("function1 运行中") await asyncio.sleep(0.5) async def function2(): # 你的异步function2逻辑 while True: print("function2 运行中") await asyncio.sleep(0.5) async def run_async_with_timeout(coro, timeout): try: await asyncio.wait_for(coro(), timeout=timeout) except asyncio.TimeoutError: pass async def main(): while True: await run_async_with_timeout(function1, 5) await run_async_with_timeout(function2, 3) asyncio.run(main())
内容的提问来源于stack exchange,提问作者fk_7
相关产品推荐
相关产品推荐

