繁体   English   中英

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使用率计算有偏差或者有什么问题?

谢谢

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

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

在所有可能的情况下,您看到的额外 60% 的 CPU 使用率只是您的各个线程争夺 GIL。

毕竟,在 GIL 之外花费了一些时间,解释器正在努力释放/获取 GIL,而 O/S 调度程序正在工作以对它们进行仲裁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM