【问题标题】:Would limiting a GILed Python program to a single CPU boost performance?将 GILed Python 程序限制为单个 CPU 会提高性能吗?
【发布时间】:2011-07-12 16:34:26
【问题描述】:

跟进David Beazley's paper 关于 Python 和 GIL 的内容,在基于 Windows 的多核系统中将 Python 程序(带有 GIL 的 CPython 等)限制为单个 CPU 是否是一个好习惯?

它会提高性能吗?

更新:假设使用了多个线程(不确定是否有所不同)

【问题讨论】:

  • CPython 只能使用一个 CPU - 那么为什么“限制”到单个 CPU 呢???
  • 是的,Blackmoon 是对的。如果你想使用多核,那么你必须使用多处理模块之类的东西。
  • @Blackmoon,通过阅读链接的论文,我认为这不是真的。特别是结帐第 37 页。
  • 我不需要阅读论文 - 自 1993 年第一次使用 CPython 以来,GIL 和 CPython 的这一事实是正确的,我从 1993 年开始使用 CPython。你的假设是错误的,或者你是误读了一些东西。
  • 它仅限于在任何给定时刻运行的单个线程(除非使用扩展或其他技巧),但我不确定操作系统是否必须在同一个 CPU 上运行它们,从而产生惩罚。我可能误解了大卫的论文,在这种情况下,请纠正我对它的理解

标签: python multicore gil


【解决方案1】:

该论文确实暗示将程序限制为单核会提高性能在这种特殊情况下。但是,您需要处理一些问题:

  1. 他的测试主要针对计算密集型线程,而不是 IO 绑定线程。如果您使用的线程经常自愿阻塞(例如在等待客户端的 Web 服务器中),那么您根本不会遇到 GIL 问题。
  2. GIL 问题专门处理线程,而不是进程。我可能读错了您的问题,但您似乎在询问将 all Python 程序限制为单个核心。使用并行进程的程序不会遇到 GIL 问题,并且将它们限制为单个内核会使它们变慢。
  3. GIL 在 Python 3.2 中完全不同(正如 David 在 this video 中提到的那样。GIL 已明确更改以处理此类问题。虽然它仍然存在问题,但它不再有 这个 问题.

总而言之,您唯一想通过强制操作系统将程序限制为单核来使您的生活复杂化的时候是在运行以下代码时:

  1. 多线程
  2. 计算密集型
  3. 低于 Python 3.2

在多核机器上编程。

【讨论】:

  • +1 我最近学习了 Beazley 的并发课程(强烈推荐),Python32 出现了。它包含了在很长一段时间内对多线程和 GIL 的第一个重大更改,并且可以说是一个糟糕的更改。
【解决方案2】:

Bias :对于涉及繁重 CPU 处理的并行计算,我非常喜欢 更喜欢消息传递和协作进程而不是线程编程 (当然要看问题)

您不应该将您的程序限制在一个核心上。 Beazley 只是演示了一个特定问题,该问题在那些独特的条件下表现不佳(这些条件是 IO 绑定线程和 CPU 绑定线程相互竞争)。理想情况下,您希望通过使用不同的方法 (import multiprocessing) 来避免这些情况。

我认为最好的解决方案是使用多处理模块将您的 CPU 绑定任务放在其他进程中,以便它们利用自己的内核,以及线程中的 IO 绑定任务(或微线程/协程,如果您阅读了他对此感兴趣的论文:http://www.dabeaz.com/coroutines/) 因为 GIL 最适合这些类型的任务。

结论:Python 线程最适合 IO 密集型任务,不是 CPU 密集型

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2016-02-24
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多