此页面记录了 CPython 的运行时和线程管理系统,该系统负责管理全局运行时状态、解释器实例、线程状态以及全局解释器锁 (GIL) 等并发控制机制。有关内存管理和对象分配的信息,请参阅对象系统和内存管理。
Python 运行时系统由几个分层组件组成,它们协同工作以管理解释器的执行环境。
运行时系统管理着
Sources: Python/pystate.c Python/pylifecycle.c Include/internal/pycore_runtime.h Include/internal/pycore_interp.h
全局运行时状态由 _PyRuntimeState 结构表示,这是一个单例,在 Python 进程的整个生命周期中都存在。它包含进程范围的信息,并作为解释器状态层次结构的根。
关键组件和字段
initialized,core_initialized)。interpreters.head)。main_interpreter)。main_thread)。autoTSSkey)。gil)。运行时通过 _PyRuntimeState_Init() 初始化,并通过 _PyRuntimeState_Fini() 销毁。在初始化期间,会创建线程局部存储键并初始化各种子系统。
Sources: Python/pystate.c446-486 Python/pystate.c489-503 Include/internal/pycore_runtime_init.h39-121
每个 Python 解释器实例由一个 PyInterpreterState 结构表示。单个进程可以共存多个解释器,每个解释器都有自己的全局状态。创建的第一个解释器是“主解释器”。
关键属性和职责
runtime)。id)。prev, next)。modules)。builtins)。sys 模块的字典(sysdict)。feature_flags)。gc)。ceval)。解释器使用 PyInterpreterState_New() 创建,并使用 PyInterpreterState_Clear() 后跟 PyInterpreterState_Delete() 销毁。
Sources: Python/pystate.c707-788 Python/pystate.c812-958 Include/internal/pycore_interp.h76-97
执行 Python 代码的每个操作系统线程都由一个 PyThreadState 结构表示。此结构维护解释器所需的线程特定执行状态。
关键组件
interp)。prev, next)。holds_gil)。state - 已附加、已分离或已挂起)。eval_breaker)。exc_value)。current_frame)。py_recursion_remaining, py_recursion_limit)。tracing, c_tracefunc, c_profilefunc)。_status)。线程状态转换遵循此生命周期。
线程状态也管理着线程局部数据所使用的线程特定存储变量。
Sources: Python/pystate.c250-301 Include/cpython/pystate.h66-265 Python/pystate.c147-178
全局解释器锁 (GIL) 是一个互斥锁,可防止多个线程在同一解释器内同时执行 Python 字节码。它是 CPython 并发模型的一个基本方面。
GIL 实现包含以下关键组件:
gil->locked)。gil->mutex)。gil->cond)。gil->interval,可通过 sys.setswitchinterval() 配置)。GIL 操作包括:
take_gil(),它会等待 GIL 可用,然后获取它。drop_gil(),它会释放 GIL 并通知等待的线程。GIL 确保了 Python 内存管理和引用计数的线程安全,但代价是无法实现真正的 Python 代码并行执行。
Sources: Python/ceval_gil.c52-275 Python/ceval_gil.c278-460
Python 3.13 引入了一个实验性的“自由线程”模式,该模式允许 Python 在没有 GIL 的情况下运行,从而实现 Python 代码在多个核心上的真正并行执行。
自由线程模式的关键方面
--disable-gil 编译 Python。PYTHON_GIL 环境变量或 X gil=0/1 选项在运行时启用/禁用。在自由线程模式下,线程安全通过原子引用计数和每个对象的锁来保证。C 扩展需要进行调整以支持此模式,导入不兼容的扩展将自动启用 GIL。
来源: Doc/whatsnew/3.13.rst102-115 Python/ceval_gil.c227-274 Include/object.h147-163
CPython 提供了多个用于创建和管理线程状态的 API
关键的线程管理函数
线程状态创建:
PyThreadState_New():为给定的解释器创建一个新的线程状态_PyThreadState_Bind():将线程状态绑定到当前的操作系统线程线程状态激活:
PyThreadState_Swap():使一个线程状态成为当前线程状态_PyThreadState_GET():获取当前线程状态(内部使用)GIL 管理:
_PyEval_AcquireLock():为线程获取 GIL_PyEval_ReleaseLock():释放 GIL线程状态终结:
PyThreadState_Clear():清除线程状态的数据PyThreadState_Delete():释放线程状态线程状态挂起 (用于无 GIL 模式)
_PyThreadState_Suspend():挂起一个线程(将其置于挂起状态)_PyThreadState_Resume():恢复一个被挂起的线程这些 API 主要由 threading 模块和需要创建或管理线程的 C 扩展使用。
来源: Python/pystate.c615-704 Python/ceval_gil.c284-378
sys 模块为 Python 代码提供了对某些运行时和线程状态信息及控制的访问权限
与运行时和线程相关的关键 sys 模块功能
GIL 控制:
sys.getswitchinterval():获取 GIL 切换间隔sys.setswitchinterval():设置 GIL 切换间隔线程信息:
sys._current_frames():获取所有线程的当前帧对象sys._current_exceptions():获取所有线程的当前异常无锁线程信息:
sys._is_gil_enabled():检查 GIL 是否启用(3.13 新增)这些 API 允许 Python 代码与运行时和线程管理系统进行交互和观察。
来源: Python/sysmodule.c79-145 Python/sysmodule.c148-212 Doc/library/sys.rst1-167
CPython 使用线程本地存储 (TLS) 将线程状态与操作系统线程关联起来
存在两种线程状态存储
_PyThreadState_GET() 访问gilstate_tss_get() 和 gilstate_tss_set() 管理线程绑定操作
bind_tstate():将线程状态与当前 OS 线程关联unbind_tstate():将线程状态与其 OS 线程解除关联bind_gilstate_tstate():为 GIL 状态 API 使用绑定线程状态这些机制确保线程状态与 OS 线程正确关联,并可以从代码的任何位置正确访问。
来源: Python/pystate.c124-165 Python/pystate.c249-301 Python/pystate.c320-354
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(ea23c8)