Python GIL 防止 CPU 在多核机器中使用率超过 100%?

Python GIL prevent CPU usage to exceed 100% in multiple core machine?

许多参考资料说,Python GIL 降低了多核机器中多线程代码的性能,因为每个线程在执行前都需要获取 GIL。

换句话说,看起来GIL把多线程Python程序变成了单线程模式。

例如:

(1)线程A获取GIL,执行一段时间,释放GIL

(2)线程B获取GIL,执行一段时间,释放GIL

...

然而,经过一些简单的实验,我发现虽然GIL降低了性能,但在多核机器上总CPU使用率可能会超过100%。

from threading import Thread

def test():
    while 1:
        pass

for i in range(4):
    t = Thread(target=test)
    t.start()

在4核8线程的机器上,上面的程序会占用160%左右CPU的使用率。 我有什么误解吗?两个线程可以同时执行?或者 CPU 使用计算 有偏差或有问题?

谢谢

很可能,您看到的额外 60% CPU 使用率只是您的各种线程争夺 GIL。

毕竟,有一些时间在 GIL 之外,解释器正在工作,release/acquire GIL 和 O/S 调度程序正在工作以仲裁它们。

除了 答案外,Python 字节码由于 GIL 而一次只能由一个处理器执行。只有某些 C 模块(不管理 Python 状态)才能同时 运行。

线程更适合I/O-bound应用程序(I/O释放GIL,允许更多并发)在其他情况下,python multi-threading更慢并且显示降级性能优于串行。因此,要利用所有内核并获得更好的性能,请使用多处理。 this 回答中对此有很好的解释,请查看!