python - Python 中哪些函数释放了 GIL?

标签 python gil

我在Python wiki上找到了这句话关于GIL的:

Luckily, many potentially blocking or long-running operations, such as I/O, image processing, and NumPy number crunching, happen outside the GIL.

GIL 之外是否有函数列表(至少在 Python 标准库中)?

或者我如何知道特定函数是否在 GIL 之外

最佳答案

the original开始命名并追踪到current implementation您可以找到这些私有(private)函数:

通过这些您可以追踪到:

ceval.c文件中。如果您grep 查找这些内容,您将看到获取或释放锁的代码部分。如果有版本,您可能会假设 GIL 至少存在于该模块中的某个位置。另一方正在查找没有获取锁的模块,因此不会操作 GIL/耗尽它。

如果您确实想这样做,这将为您提供一些开始跟踪的步骤。然而,我怀疑即使对于标准库来说,函数列表也是有限的,因为代码库非常大/不稳定,甚至无法为此保留文档。但我希望被证明是错的。

还有这两个宏,正如评论中指出的:

这应该find more matches在代码中。 (GitHub 链接可能需要登录)

或者,如果它被强制登录屏幕完全锁定:

git clone --depth 1 https://github.com/python/cpython
grep -nr -C 5 Py_BEGIN_ALLOW_THREADS cpython

对于您的报价:

Luckily, many potentially blocking or long-running operations, such as I/O, image processing, and NumPy number crunching, happen outside the GIL.

我更倾向于这样的解释:与性能相关的任务是用较低级语言(例如 C;与 Python 相比)实现的,例如 I/O、计算等。并且用 C 实现的模块努力工作时尽量不要获取锁(或提前释放它)当努力工作时,然后在使用Python(解释器)上下文/变量进行操作时获取它,以便可以存储结果。从而将艰苦的工作保持在其 C 实现的性能水平上,而不会因与解释器内部的通信而减慢速度。

关于python - Python 中哪些函数释放了 GIL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73104175/

相关文章:

python - 从任意 css 文件中获取特定类的所有 css 属性

python - Pydoop 卡在 HDFS 文件的 readline 上

python - file.read() 多处理和 GIL

python - 为什么 Python 的 GIL 强制执行严格的处理顺序?

python - KMeans 并行处理失败

python - Tensorflow,Keras : Expected to see 1 array(s), 但得到了以下 2 个数组的列表

python - pandas read_csv 编码列表列表

python - 是否有通用的方法来测试 GIL 的存在?

python - 在 python 中将列表转换为 HTML 表格的最简单方法?

python - Python 线程什么时候快?