Lis*_*isa 10 python multithreading numpy multiprocessing gil
我正在尝试决定是否应该使用多处理或线程,并且我已经学习了一些有关Global Interpreter Lock的有趣内容.在这篇不错的博文中,似乎多线程不适合繁忙的任务.但是,我还了解到一些功能,如I/O或numpy,不受GIL的影响.
任何人都可以解释为什么,以及我如何能够找出我的(可能非常重的)代码是否适合多线程?
mfi*_*tzp 17
许多 numpy计算不受GIL的影响,但不是全部.
在不需要Python解释器的代码(例如C库)中,可以专门释放GIL - 允许依赖于解释器的其他代码继续运行.在numpy的Ç代码库中的宏NPY_BEGIN_THREADS和NPY_END_THREADS用于分隔允许GIL释放的代码块.您可以在numpy源代码的搜索中看到这些内容.
该NumPy的C API文档,对线程支持的更多信息.请注意其他宏NPY_BEGIN_THREADS_DESCR,NPY_END_THREADS_DESCR并NPY_BEGIN_THREADS_THRESHOLDED处理条件GIL释放,这取决于数组dtypes和循环的大小.
最核心的功能释放GIL -例如通用功能(ufunc)这样做所描述的:
只要不涉及任何对象数组,就会在调用循环之前释放Python全局解释器锁(GIL).如有必要,可以重新获取它以处理错误情况.
关于您自己的代码,可以使用NumPy的源代码.检查上述宏使用的功能(以及它们调用的功能).还要注意的性能优势在很大程度上取决于如何长的GIL被释放-如果你的代码是不断下降的输入/输出的Python,你不会看到多大的改善.
另一种选择是测试它.但是,请记住,使用条件GIL宏的函数可能会对小型和大型数组表现出不同的行为.因此,使用小数据集的测试可能无法准确表示较大任务的性能.
在官方维基上有关于 numpy的并行处理的一些附加信息,以及关于程序员的一般有关Python GIL的有用帖子.