【问题标题】:python multiple thread performancepython多线程性能
【发布时间】:2015-09-06 01:33:42
【问题描述】:

我有一台有 10 个 cpu 核心的服务器,当我运行以下代码时,其中一个线程,其中一个 cpu 核心使用率为 100%:

def fun():
    while 1:
        pass

但是当我使用 5 个线程运行相同的代码时,有 5 个 cpu 核心使用率分别为:30%、20%、15%、25%、12%。

为什么不是 5 个 cpu 核心分别具有 100% 的使用率?如果多个python线程不能充分利用cpu,多线程应该怎么比一个线程快?

【问题讨论】:

标签: python multithreading python-multithreading gil


【解决方案1】:

您所描述的是典型的瓶颈,当更多内核尝试访问单个锁时,它会变得更加普遍。正如 mgilson 提到的,这是 GIL 的副作用,它存在于 Python 的许多实现中。 Python 中的 GIL 保证一次只有一个线程执行 Python 字节码。这是出于历史原因。但正如 Roland 在 cmets 中提到的那样,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 模块可以在这里为您提供帮助。

【讨论】:

  • 避免的一种解决方案”?可能您的意思是“一种可能的解决方案”。
  • 我编辑了答案,我相信@AndreaCorbellini 是正确的。
  • 那些历史原因过去和现在都非常实用有效。拥有 GIL 使垃圾收集代码变得更简单(它不是线程安全的,但如果没有 GIL 就必须如此)。删除 GIL 的愿望已经出现了好几次,但没有人成功,for several reasons
  • AndreaCorbellin 是对的,是的,但下次请给 OP 一些时间。我更喜欢自己更正我的答案。西部最快的枪也适用于剪辑。 @RolandSmith:是的。我不想暗示 GIL 很糟糕。我将此添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 2021-08-11
相关资源
最近更新 更多