python多线程性能

标签 python multithreading python-multithreading gil

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

相关文章:

java - 在 Android Studio 中使用线程崩溃 Java apk

java - Java中监视器重新获得的顺序

python - 在 Python 线程中什么是和不是自动线程本地的?

python - 将 pandas DataFrame 读取到 Stocker 时出现问题

python - datetime64[ns] 与日期的比较

python - 从文件中读取文本,然后写入另一个文件,并标记重复的文本

python - sklearn : Hyperparameter tuning by gradient descent?

multithreading - 第一次点击按钮无响应

python - Python 线程中 join() 的用途是什么?

python - Python:上传图片而不会干扰程序的正常流程