我在网上找到了关于GIL的这句话Python 维基 https://wiki.python.org/moin/GlobalInterpreterLock:
幸运的是,许多潜在的阻塞或长时间运行的操作(例如 I/O、图像处理和 NumPy 数字运算)都发生在 GIL 之外。
有没有函数列表在 GIL 之外(至少在Python标准库中)?
或者我怎样才能知道某个特定功能是否是在 GIL 之外?
从...开始原本的 https://youtu.be/KVKufdTphKs?t=682命名并追踪目前的实施 https://github.com/python/cpython/blob/main/Python/ceval.c你可以找到这些私有函数:
- _gil_initialize() https://github.com/python/cpython/blob/caa279d6fd5f151e57f891cd4f6ba51b532501c6/Python/ceval_gil.h#L93
- gil_created() https://github.com/python/cpython/blob/caa279d6fd5f151e57f891cd4f6ba51b532501c6/Python/ceval_gil.h#L100
- create_gil() https://github.com/python/cpython/blob/caa279d6fd5f151e57f891cd4f6ba51b532501c6/Python/ceval_gil.h#L105
- destroy_gil() https://github.com/python/cpython/blob/caa279d6fd5f151e57f891cd4f6ba51b532501c6/Python/ceval_gil.h#L120
- recreate_gil() https://github.com/python/cpython/blob/caa279d6fd5f151e57f891cd4f6ba51b532501c6/Python/ceval_gil.h#L136
- drop_gil() https://github.com/python/cpython/blob/caa279d6fd5f151e57f891cd4f6ba51b532501c6/Python/ceval_gil.h#L144
- take_gil() https://github.com/python/cpython/blob/caa279d6fd5f151e57f891cd4f6ba51b532501c6/Python/ceval_gil.h#L211
通过这些您可以追踪到:
- PyEval_AcquireLock() https://github.com/python/cpython/blob/5956de16cd00e7e1cf5cbf3d7b4a930eaa928321/Python/ceval.c#L427
- PyEval_ReleaseLock() https://github.com/python/cpython/blob/5956de16cd00e7e1cf5cbf3d7b4a930eaa928321/Python/ceval.c#L437
- etc
in the ceval.c
文件。如果你grep
对于这些,您将了解获取或释放锁的代码部分。如果有版本,您可能会假设 GIL 至少存在于该模块中的某个位置。另一方正在查找没有获取锁的模块,因此不要操作 GIL/耗尽它。
如果您确实想这样做,这将为您提供一些开始跟踪的步骤。然而,我怀疑即使对于标准库来说,函数列表也是有限的,因为代码库非常大/不稳定,甚至无法为此保留文档。但我希望被证明是错的。
正如评论中指出的,还有这两个宏:
- Py_BEGIN_ALLOW_THREADS https://docs.python.org/3/c-api/init.html#c.Py_BEGIN_ALLOW_THREADS
- Py_END_ALLOW_THREADS https://docs.python.org/3/c-api/init.html#c.Py_END_ALLOW_THREADS
哪个应该找到更多匹配项 https://github.com/python/cpython/search?q=Py_BEGIN_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 实现的性能水平上,而不会因与解释器内部的通信而减慢速度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)