GIL -- global interpreter lock -- 全局解释器锁
CPython
是用 C 语言实现的 Python 解释器。作为官方实现,它是最广泛使用的 Python 解释器。除了 CPython 以外,还有用 Java 实现的 Jython
,用 .NET 实现的 IronPython
,使 Python 方便地和 Java 程序、.NET 程序集成。另外还有一些实验性的 Python 解释器比如 PyPy
。
GIL 是 CPython 解释器所采用的一种机制,它确保同一时刻只有一个线程在执行 Python bytecode
(字节码,其解释看下文)。此机制通过设置对象模型(包括 dict 等重要内置类型)针对并发访问的隐式安全简化了 CPython 实现。给整个解释器加锁使得解释器多线程运行更方便,其代价则是牺牲了在多处理器上的并行性。
bytecode -- 字节码
Python 源代码会被编译为字节码,即 CPython 解释器中表示 Python 程序的内部代码。字节码还会缓存在.pyc
文件中,这样第二次执行同一文件时速度更快(可以免去将源码重新编译为字节码)。这种 "中间语言" 运行在根据字节码执行相应机器码的 virtual machine 之上。请注意不同 Python 虚拟机上的字节码不一定通用,也不一定能在不同 Python 版本上兼容。
GIL 的存在更多的是历史原因。早期 CPython 都是基于在单核 CPU 的前提下设计的,没考虑过多核的情况。
一些扩展模块,无论是标准的还是第三方的,都被设计成在执行压缩或散列等计算密集型任务时释放 GIL。 此外,在执行 I/O 时总是释放 GIL。
创建一个(以更精细粒度来锁定共享数据的)“自由线程”解释器的努力从未获得成功,因为这会牺牲在普通单处理器情况下的性能。据信克服这种性能问题的措施将导致实现变得更复杂,从而更难以维护。
=== 全文完 ===