哪些函数在Python中发布GIL

  • 本文关键字:GIL Python 函数 python gil
  • 更新时间 :
  • 英文 :


我在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实现的性能级别上保持了艰苦的工作,而不会因为与解释器内部的通信而放慢速度。

最新更新