为何Python多线程进程会占用全部CPU核心?
为什么你的4线程Python进程会占满4个CPU核心?
这事儿得从Python的**全局解释器锁(GIL)**和线程等待锁的方式说起,咱们拆解一下:
首先看你的代码,每个线程都在跑while True: continue——这是个完全没有IO、没有任何阻塞操作的纯CPU密集型无限循环,而且全程都是Python字节码层面的执行。
你可能听过“Python多线程在CPU密集任务下只能用一个核心”,这话没错,但为什么你的情况是4个核心全满?核心原因就在线程等待GIL的方式上:
- Python的GIL规定,同一时刻只有一个线程能执行Python字节码。当一个线程在执行代码时,其他线程不会进入睡眠状态,而是会自旋等待(忙等)——也就是不停检查GIL是否被释放,这个过程会持续占用CPU资源,不会把CPU让出去。
- 你的4个线程,每个要么在抢到GIL后疯狂跑循环,要么在忙等GIL。操作系统会把这4个线程分别调度到4个核心上,每个核心上的线程要么在执行代码,要么在忙等锁,自然就把每个核心的使用率都拉到接近100%了。
举个反例:如果你的线程里有IO操作(比如读文件、发网络请求),或者调用了会释放GIL的C扩展,那等待的线程会进入睡眠状态,不会占用CPU,这时候就不会出现全核心占满的情况。但你的代码是纯循环,完全没有任何能让线程暂停的点,所以每个线程都在“抢CPU→等锁→抢CPU”的死循环里,把所有核心都占满了。
你的代码如下:
import threading def worker(): """thread worker function""" while True: continue return threads = [] for i in range(4): t = threading.Thread(target=worker) threads.append(t) t.start()
对应的CPU负载截图显示:4个CPU核心的使用率均接近100%,进程整体CPU占用率达到约400%。
内容的提问来源于stack exchange,提问作者Archer Li SZ




