我们都知道GIL的可怕之处,我也看到了很多multiprocessing
关于何时使用该模块的讨论,但我仍然不觉得我对 Python 中的线程有很好的直觉(专注于主要在 CPython 上)是正确的答案。
在哪些情况下 GIL 不是重大瓶颈?线程是最合适的答案的用例类型有哪些?
我们都知道GIL的可怕之处,我也看到了很多multiprocessing
关于何时使用该模块的讨论,但我仍然不觉得我对 Python 中的线程有很好的直觉(专注于主要在 CPython 上)是正确的答案。
在哪些情况下 GIL 不是重大瓶颈?线程是最合适的答案的用例类型有哪些?
线程只有在你有很多阻塞 I/O 的情况下才有意义。如果是这种情况,那么一些线程可以在其他线程工作时休眠。如果线程受 CPU 限制,那么您不太可能从多线程中看到太多好处。
请注意,多处理模块虽然更难编写代码,但使用了单独的进程,因此不会受到 GIL 的不利影响。
由于您似乎正在寻找示例,因此这里有一些是我脑海中浮现的,是从搜索 CPU-bound 和 I/O-bound 示例中获取的(我似乎找不到很多)。我不是专家,所以请随时纠正我错误分类的任何内容。还值得注意的是,先进的技术可能会将问题从一个类别转移到另一个类别。
multiprocessing
)threading
可能没问题)GIL 阻止python运行多个线程。
如果您的代码在跳转到 C 扩展之前释放 GIL,则其他 python 线程可以在 C 代码运行时继续。就像其他人提到的阻塞 IO 一样。
Ctypes 会自动执行此操作,numpy 也是如此。因此,如果您的代码大量使用它们,它可能不会受到 GIL 的显着限制。
除了 CPU 密集型和 I/O 密集型任务之外,还有更多用例。例如,线程启用并发任务。很多 GUI 编程都属于这一类。主循环必须响应鼠标事件。因此,只要您有一项需要一段时间的任务并且您不想冻结 UI,您就可以在单独的线程上执行它。它与性能无关,而与并行性有关。