You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何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

火山引擎 最新活动