我正试图决定是否应该使用多处理或线程处理,并且我已经了解了一些关于全局解释器锁的有趣的信息。在这个不错的博客帖子中,多线程似乎不适合繁忙的任务。但是,我也了解到一些功能(如I/O或numpy )不受GIL的影响。
有人能解释一下为什么吗?我怎样才能知道我的代码(可能很重)是否适合多线程呢?
发布于 2016-04-07 15:37:09
许多不起眼的计算不受GIL的影响,但并不是全部。
在不需要Python解释器(例如C库)的代码中,可以专门发布GIL --允许依赖于解释器的其他代码继续运行。在Numpy C代码库中,宏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)这样做,如所述
只要不涉及对象数组,在调用循环之前就会释放PythonGlobal解释器锁(GIL)。如果有必要,将重新获取以处理错误条件。
关于您自己的代码,可获得NumPy的源代码。检查您为上述宏使用的函数(以及它们调用的函数)。还要注意的是,性能的好处在很大程度上取决于GIL发布的时间--如果您的代码不断地在Python中出现/退出,您将不会看到多少改进。
另一种选择是直接测试它。但是,请记住,使用条件GIL宏的函数在小数组和大数组中可能表现出不同的行为。因此,使用小数据集的测试可能不能准确地表示较大任务的性能。
还有一些关于使用numpy可用关于官方维基的并行处理的其他信息,以及关于Python的有用文章(一般为在Programmers.SE上 )。
https://stackoverflow.com/questions/36479159
复制相似问题