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 回答中对此有很好的解释,请查看!
许多参考资料说,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 调度程序正在工作以仲裁它们。
除了
线程更适合I/O-bound应用程序(I/O释放GIL,允许更多并发)在其他情况下,python multi-threading更慢并且显示降级性能优于串行。因此,要利用所有内核并获得更好的性能,请使用多处理。 this 回答中对此有很好的解释,请查看!