Python threading多线程运行while循环占满单个CPU逻辑核心原因求解
问题原因
- 核心诱因是主线程末尾的无阻塞空死循环:你代码最后写的
while True: pass没有任何IO、sleep等阻塞逻辑,会持续占用CPU执行空指令,永远不会主动让出CPU资源。 - 结合CPython的全局解释器锁(GIL)机制:同一时间只有一个线程可以执行Python字节码,你启动的两个子线程如果内部有sleep操作,会在sleep时主动释放GIL,此时空转的主线程就会立刻拿到GIL持续运行空循环,整体表现就是始终占满一个逻辑核心的算力。
- 补充说明:你当前写的
loop_function0、loop_function1的while循环外层没有加sleep逻辑,如果function0、function1内部也没有触发阻塞的逻辑,两个子线程也会加入GIL争抢,会进一步推高CPU占用,但核心占用来源还是主线程的空循环。
修复方案
你不需要修改业务函数,仅调整主线程的等待逻辑即可,两种常用方案:
- 给主线程的循环加sleep,等待时主动让出CPU:
# 替换原有的while True: pass while True: sleep(3600) # 单次等待时长可按需调整,只要不为0就不会空转占CPU
- 用
join方法阻塞等待子线程运行,完全不额外占用CPU:
# 保留原有线程类定义,修改启动和等待逻辑 t0 = thread0() t1 = thread1() # 主线程阻塞等待两个子线程退出,无任何空转开销 t0.join() t1.join()
注意:如果你的代码未显式导入Thread类,需要在头部补充导入语句
from threading import Thread
内容的提问来源于stack exchange,提问作者ammernico
相关产品推荐
相关产品推荐

