Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么numpy计算不受全局解释器锁的影响?_Python_Multithreading_Numpy_Multiprocessing_Gil - Fatal编程技术网

Python 为什么numpy计算不受全局解释器锁的影响?

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

我正在尝试决定我应该使用多处理还是线程,我已经了解了一些关于线程的有趣内容。在这种情况下,多线程似乎不适合繁忙的任务。然而,我还了解到一些功能,如I/O或numpy,不受GIL的影响

有人能解释一下为什么,以及我如何才能发现我的(可能相当重的)代码是否适合多线程处理吗?

许多numpy计算不受GIL的影响,但不是全部

在不需要Python解释器(例如C库)的代码中,可以专门释放GIL,从而允许依赖于解释器的其他代码继续运行。在Numpy C代码库中,宏
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的有用文章