是否将GILed Python程序限制为单个CPU提升性能?

时间:2011-07-12 16:34:27

标签: python multicore gil

关于Python和GIL关注David Beazley's paper,将基于Windows的多核系统中的Python程序(带有GIL和CP的CPython)限制为单个CPU会是一个好习惯吗?

会提升表现吗?

UPDATE:假设使用了多个线程(不确定它是否有所作为)

2 个答案:

答案 0 :(得分:4)

本文确实暗示将程序限制为单个核心可以提高在该特定情况下的性能。但是,您需要处理许多问题:

  1. 他的测试主要针对计算密集型线程而不是IO绑定线程。如果您使用的线程经常自动阻塞(例如在Web服务器中等待客户端),那么您根本不会遇到GIL问题。
  2. GIL问题专门处理线程而不是进程。我可能会错误地阅读您的问题,但您似乎要求将所有 Python程序限制为单个核心。使用并行过程的程序不会受到GIL问题的影响,将它们限制在单个核心会使它们变慢。
  3. GIL在Python 3.2中大相径庭(正如David在this video中提到的那样.GIL明确地被改变以处理这些问题。虽然它仍有问题,但它不再有这个问题。
  4. 总而言之,只有当您运行以下操作时,您希望通过强制操作系统将程序限制为单个核心来使您的生活变得复杂:

    1. 多线程
    2. Compute Intensive
    3. 低于Python 3.2
    4. 在多核机器上编程。

答案 1 :(得分:0)

  

偏见:对于涉及大量CPU处理的并行计算,我非常喜欢   更喜欢消息传递和协作进程来进行线程编程   (当然,这取决于问题)

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

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

结论:Python线程最适合IO绑定任务,非CPU绑定