我们都知道GIL的恐怖,我看到很多关于使用
在哪些情况下GIL不是一个重大瓶颈?哪些类型的用例是线程最合适的选择?
multiprocessing
模块的讨论,但我仍然不觉得自己对Python中的线程(主要是CPython)何时是正确答案有很好的直觉。在哪些情况下GIL不是一个重大瓶颈?哪些类型的用例是线程最合适的选择?
multiprocessing
模块的讨论,但我仍然不觉得自己对Python中的线程(主要是CPython)何时是正确答案有很好的直觉。如果有很多阻塞I/O操作,使用线程才有意义。在这种情况下,一些线程可以睡眠,而其他线程则可以工作。如果线程受限于CPU,则不太可能从多线程中获得多少好处。
请注意,multiprocessing模块虽然编码更加困难,但利用了单独的进程,因此不会受到GIL的缺点的影响。
看起来你在寻找一些例子,以下是我能想到和从搜索CPU和I/O限制的例子中获得的。请注意,我不是专家,请随时更正我分类错误的内容。同时也值得注意的是,先进的技术可能会将问题从一类移动到另一类。
multiprocessing
)threading
可能可行)GIL(全局解释器锁)防止Python运行多个线程。
如果您的代码在进入C扩展之前释放了GIL,则其他Python线程可以在C代码运行时继续运行。就像其他人提到的阻塞IO一样。
Ctypes会自动执行此操作,numpy也是如此。因此,如果您的代码经常使用它们,可能不会受到GIL的显着限制。
multiprocessing
比线程更合适是合理的吗?我认为,在某些情况下,上下文切换的开销与GIL引起的开销相比,并不会那么糟糕。 - mvanveen