Python 中哪些函数释放了 GIL?

2024-02-22

我在网上找到了关于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(使用前将#替换为@)

Python 中哪些函数释放了 GIL? 的相关文章

随机推荐