python 多线程性能

python multiple thread performance

我有一台有 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

Python3:http://www.dabeaz.com/python/NewGIL.pdf

一个解决方案是产生独立的 Python 解释器。它们作为单独的进程工作,可以完成自己的工作。 multiprocessing 模块可以在此处为您提供帮助。