1

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

它会提高性能吗?

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

4

2 回答 2

4

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

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

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

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

多核机器上的程序。

于 2011-07-12T17:25:54.767 回答
0

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

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

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

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

于 2011-07-12T17:16:50.143 回答