我在Python wiki上找到了关于GIL的这句话:
幸运的是,许多潜在的阻塞或长时间运行的操作,如I/O、图像处理和NumPy数字运算,都发生在GIL之外。
在GIL之外是否有函数列表(至少在Python标准库中(?
或者,我如何知道特定函数是否在GIL之外?
从最初的命名和跟踪到当前的实现,您可以找到以下私有函数:
_gil_initialize()
gil_created()
create_gil()
destroy_gil()
recreate_gil()
drop_gil()
take_gil()
有了这些,你可以追踪到:
PyEval_AcquireLock()
PyEval_ReleaseLock()
- 等等
在ceval.c
文件中。如果您为这些grep
,您将获得获取或释放锁的代码部分。如果有一个版本,您可能会假设GIL至少存在于该模块的某个地方。另一方正在查找没有锁获取的模块,因此不会操作GIL/用完它。
如果你真的想这样做的话,这应该会给你一些开始追踪它的步骤。然而,即使对于标准库,我也怀疑函数的列表是有限的,因为代码库非常大/不稳定,甚至无法为此保存文档。不过,我希望被证明是错的。
还有这两个宏,正如评论中所指出的:
Py_BEGIN_ALLOW_THREADS
Py_END_ALLOW_THREADS
这应该会在代码中找到更多匹配项。(GitHub链接可能需要登录(
或者,如果它被强制登录屏幕完全锁定:
git clone --depth 1 https://github.com/python/cpython
grep -nr -C 5 Py_BEGIN_ALLOW_THREADS cpython
对于您的报价:
幸运的是,许多潜在的阻塞或长时间运行的操作,如I/O、图像处理和NumPy数字运算,都发生在GIL之外。
我宁愿解释依赖性能的任务是用较低级别的语言(如C;与Python相比(实现的,如I/O、计算等。用C实现的模块在努力工作时尽量不获取锁(或提前释放锁(,然后在使用Python(解释器的(上下文/变量进行操作时获取它,以便可以存储结果。因此,在C实现的性能级别上保持了艰苦的工作,而不会因为与解释器内部的通信而放慢速度。