[英]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.