11

我们都知道GIL的可怕之处,我也看到了很多multiprocessing关于何时使用该模块的讨论,但我仍然不觉得我对 Python 中的线程有很好的直觉(专注于主要在 CPython 上)是正确的答案。

在哪些情况下 GIL 不是重大瓶颈?线程是最合适的答案的用例类型有哪些?

4

4 回答 4

14

线程只有在你有很多阻塞 I/O 的情况下才有意义。如果是这种情况,那么一些线程可以在其他线程工作时休眠。如果线程受 CPU 限制,那么您不太可能从多线程中看到太多好处。

请注意,多处理模块虽然更难编写代码,但使用了单独的进程,因此不会受到 GIL 的不利影响。

于 2012-01-24T21:32:46.973 回答
10

由于您似乎正在寻找示例,因此这里有一些是我脑海中浮现的,是从搜索 CPU-bound 和 I/O-bound 示例中获取的(我似乎找不到很多)。我不是专家,所以请随时纠正我错误分类的任何内容。还值得注意的是,先进的技术可能会将问题从一个类别转移到另一个类别。

CPU 绑定任务(使用multiprocessing

  • 数学函数的数值方法/近似值(计算 pi 的位数等)
  • 图像处理
  • 执行卷积
  • 计算图形编程的变换(可能由 GPU 处理)
  • 音频/视频压缩/解压缩

I/O 绑定任务(threading可能没问题)

  • 通过网络发送数据
  • 写入/读取磁盘
  • 请求用户输入
  • 音频/视频流
于 2012-01-24T21:55:00.170 回答
2

GIL 阻止python运行多个线程。

如果您的代码在跳转到 C 扩展之前释放 GIL,则其他 python 线程可以在 C 代码运行时继续。就像其他人提到的阻塞 IO 一样。

Ctypes 会自动执行此操作,numpy 也是如此。因此,如果您的代码大量使用它们,它可能不会受到 GIL 的显着限制。

于 2012-01-24T22:37:59.493 回答
0

除了 CPU 密集型和 I/O 密集型任务之外,还有更多用例。例如,线程启用并发任务。很多 GUI 编程都属于这一类。主循环必须响应鼠标事件。因此,只要您有一项需要一段时间的任务并且您不想冻结 UI,您就可以在单独的线程上执行它。它与性能无关,而与并行性有关。

于 2012-01-24T22:25:09.753 回答