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

Python GIL在多核机器中防止CPU使用率超过100%?,python,multithreading,locking,cpython,gil,Python,Multithreading,Locking,Cpython,Gil,许多参考文献指出,Python GIL降低了多核机器中多线程代码的性能,因为每个线程在执行之前都需要获取GIL 换句话说,事实上,GIL似乎将多线程Python程序转换为单线程模式 例如: (1) 线程获取GIL,执行一段时间,释放GIL (2) 线程B获取GIL,执行一段时间,释放GIL 然而,经过一些简单的实验,我发现尽管GIL降低了性能,但在多核机器中,CPU的总使用率可能超过100% from threading import Thread def test(): while

许多参考文献指出,Python GIL降低了多核机器中多线程代码的性能,因为每个线程在执行之前都需要获取GIL

换句话说,事实上,GIL似乎将多线程Python程序转换为单线程模式

例如:

(1) 线程获取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之外花费了一些时间来释放/获取GIL,而O/S调度程序正在对它们进行仲裁。

除此之外,由于GIL,Python字节码一次只能由单个处理器执行。只有某些C模块(不管理Python状态)能够并发运行

线程更适合于I/O绑定的应用程序(I/O释放了GIL,允许更多的并发性)。在其他情况下,python多线程比串行线程速度慢,性能下降。因此,要利用所有内核并获得更好的性能,请使用多处理。
答案中有一个很好的解释,看看吧

你是如何衡量CPU使用率的?我的猜测是Python仍然绑定在一个核心上,但其他进程可以自由使用另一个。@PeterWood如果你在shell中运行
top
,它将显示
%CPU
@msw,但如果我没有误解的话,Python进程的所有四个线程都需要在执行之前保持GIL。