Python 为什么numpy计算不受全局解释器锁的影响?
我正在尝试决定我应该使用多处理还是线程,我已经了解了一些关于线程的有趣内容。在这种情况下,多线程似乎不适合繁忙的任务。然而,我还了解到一些功能,如I/O或numpy,不受GIL的影响 有人能解释一下为什么,以及我如何才能发现我的(可能相当重的)代码是否适合多线程处理吗?许多numpy计算不受GIL的影响,但不是全部 在不需要Python解释器(例如C库)的代码中,可以专门释放GIL,从而允许依赖于解释器的其他代码继续运行。在Numpy C代码库中,宏Python 为什么numpy计算不受全局解释器锁的影响?,python,multithreading,numpy,multiprocessing,gil,Python,Multithreading,Numpy,Multiprocessing,Gil,我正在尝试决定我应该使用多处理还是线程,我已经了解了一些关于线程的有趣内容。在这种情况下,多线程似乎不适合繁忙的任务。然而,我还了解到一些功能,如I/O或numpy,不受GIL的影响 有人能解释一下为什么,以及我如何才能发现我的(可能相当重的)代码是否适合多线程处理吗?许多numpy计算不受GIL的影响,但不是全部 在不需要Python解释器(例如C库)的代码中,可以专门释放GIL,从而允许依赖于解释器的其他代码继续运行。在Numpy C代码库中,宏NPY\u BEGIN\u THREADS和N
NPY\u BEGIN\u THREADS
和NPY\u END\u THREADS
用于划分允许GIL释放的代码块。你可以在地图上看到这些
提供了有关线程支持的详细信息。请注意附加的宏NPY\u BEGIN\u THREADS\u DESCR
、NPY\u END\u THREADS\u DESCR
和NPY\u BEGIN\u THREADS\u THREADS\u THREADS\u threshold
处理条件GIL释放,具体取决于数组dtypes
和循环的大小
大多数核心功能都会发布GIL,例如:
只要不涉及对象数组,就在调用循环之前释放Python全局解释器锁(GIL)。如果有必要处理错误条件,将重新获取
关于您自己的代码,请参阅。检查上述宏使用的函数(以及它们调用的函数)。还请注意,性能优势在很大程度上取决于GIL发布的时间长短——如果您的代码不断地在Python中输入/输出,您将看不到多少改进
另一个选择是测试它。但是,请记住,使用条件GIL宏的函数在小数组和大数组中可能表现出不同的行为。因此,使用小数据集的测试可能无法准确表示更大任务的性能
有一些关于numpy并行处理的附加信息,以及一篇关于Python GIL的有用文章