如何解决为什么numpy计算不受全局解释器锁定的影响?
许多 numpy计算不受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)这样做所描述的:
只要不涉及任何对象数组,就在调用循环之前释放Python全局解释器锁(GIL)。如有必要,可以重新获取它以处理错误情况。
关于您自己的代码,可以使用NumPy的源代码。检查以上宏所使用的功能(以及它们调用的功能)。还要注意的性能优势在很大程度上取决于如何长 的GIL被释放-如果你的代码是不断输入/输出的Python的下降,你不会看到多大的改善。
另一个选择是对其进行测试。但是,请记住,使用条件GIL宏的函数可能会在大小数组上表现出不同的行为。因此,使用小型数据集进行的测试可能无法正确表示较大任务的性能。
官方Wiki上提供了有关numpy并行处理的其他信息,以及有关Programmers.SE的有关Python GIL的有用文章。
解决方法
我正在尝试决定应该使用多处理还是线程处理,并且我学到了一些有关Global Interpreter
Lock的有趣知识。在这篇不错的博客文章中,似乎多线程不适合繁忙的任务。但是,我还了解到,某些功能(例如I / O或numpy)不受GIL的影响。
谁能解释为什么,以及如何确定我的(可能很笨拙的)代码是否适合多线程?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。