我有一台有 10 个 cpu 核心的服务器,当我运行以下代码时,其中一个线程,其中一个 cpu 核心使用率为 100%:
def fun():
while 1:
pass
但是当我使用5个线程运行相同的代码时,有5个CPU核心的使用率分别为:30%、20%、15%、25%、12%。
为什么不是 5 个 cpu 核心分别达到 100% 使用率?如果多个Python线程无法充分利用CPU,那么多个线程如何比一个线程更快?
最佳答案
您所描述的是典型的瓶颈,当更多核心尝试访问单个锁时,该瓶颈就会变得更加存在。正如 mgilson 提到的,这是 GIL 的副作用,它存在于许多 Python 实现中。 Python 中的 GIL 保证一次只有一个线程执行 Python 字节码。这是有历史原因的。但正如 Roland 在评论中提到的,GIL 使例如垃圾收集器的调试更加容易。有些实现(例如 IronPython)没有 GIL。
Python 2 和 Python 3 线程获取 GIL 的方法不同。
Python 2:http://www.dabeaz.com/python/GIL.pdf
Python 3:http://www.dabeaz.com/python/NewGIL.pdf
一种解决方案是生成独立的 Python 解释器。它们作为独立的进程工作并且可以完成自己的工作。 multiprocessing
模块可以在这方面为您提供帮助。
关于python多线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32419202/