Python如何同时运行两个无限while循环,带1秒定时的不影响另一个
Python双无限循环逻辑并发实现方案
问题原因说明
你之前把两套逻辑放在同一个while循环里出现干扰,本质是单线程代码串行执行导致的:带定时器的逻辑里的time.sleep()或定时等待操作会阻塞整个线程,无定时的逻辑只能等定时逻辑的等待结束后才能执行,自然无法正常运行。
Python完全支持同时运行两套无限循环逻辑,以下是三种成熟的实现方案,可根据你的业务场景选择:
方案1:多线程实现(优先推荐,适配绝大多数场景)
对包含定时等待、IO操作的业务场景来说,多线程是成本最低的实现方式,两套逻辑运行在独立线程内完全互不干扰,GIL的影响在有等待操作的场景下可以忽略。
示例代码
import threading import time # 带每秒定时的业务逻辑 def timed_task(): while True: # 替换为你自己的业务代码 print(f"定时任务执行: {time.ctime()}") time.sleep(1) # 无定时的无限循环业务逻辑 def endless_task(): while True: # 替换为你自己的业务代码 print("无定时任务执行") # 若业务逻辑为纯计算无IO,可加time.sleep(0)主动让出CPU调度 if __name__ == "__main__": # daemon=True设置为守护线程,主程序退出时自动终止线程 t1 = threading.Thread(target=timed_task, daemon=True) t2 = threading.Thread(target=endless_task, daemon=True) t1.start() t2.start() # 主线程阻塞避免直接退出 while True: time.sleep(3600)
方案2:异步协程实现(适合全IO密集型业务)
如果两套逻辑都以IO操作为主(比如接口请求、文件读写、数据库操作),可以用asyncio实现单线程内的并发,资源开销比多线程更低。
示例代码
import asyncio import time async def timed_task(): while True: print(f"定时任务执行: {time.ctime()}") # 必须用asyncio的sleep,不能用time.sleep否则会阻塞整个协程 await asyncio.sleep(1) async def endless_task(): while True: print("无定时任务执行") # 纯计算逻辑需加await asyncio.sleep(0)主动让出调度权 await asyncio.sleep(0) async def main(): # 并发运行两个协程任务 await asyncio.gather(timed_task(), endless_task()) if __name__ == "__main__": asyncio.run(main())
方案3:多进程实现(仅适合计算密集型业务)
如果你的无定时逻辑是CPU密集型计算,多线程会受GIL限制无法真正并行,这时候用多进程可以完全利用多核CPU,两套逻辑完全隔离。
注意:多进程的资源开销远高于多线程,进程间共享数据需要用
multiprocessing.Queue、Pipe等专门的通信工具,没有计算密集需求不推荐使用。
注意事项
- 若定时任务对时间精度要求极高,可以给定时任务线程/进程设置更高的调度优先级,普通场景默认调度即可满足需求。
- 多线程场景下如果两套逻辑需要共享数据,必须加
threading.Lock()避免竞态条件导致的数据异常。
内容的提问来源于stack exchange,提问作者Jackem
相关产品推荐
相关产品推荐

