Python 多线程与多进程:原理、实践与应用
1. 全局解释器锁(GIL)概述
全局解释器锁(GIL)并非 Python(或 CPython)所独有,其他编程语言如 Ruby 的官方实现 Ruby MRI 以及 OCaml 也有 GIL。在 CPython 中,由于内存管理并非线程安全,GIL 是必要的。它通过强制所有操作串行执行,确保内存不会被破坏。对于单线程程序而言,GIL 能提升执行速度,并且简化了 C 扩展的创建,因为开发者无需考虑多线程问题。
不过,也有一些绕过 GIL 的方法:
- 使用 C 代码 :由于 GIL 仅阻止线程同时运行 Python 字节码,因此可以用 C 语言编写任务代码,而 Python 仅作为代码的包装器。在这种情况下,GIL 不会阻止 C 代码同时运行所有线程。
- 网络服务器场景 :对于大部分时间用于从网络读取数据包的网络服务器,GIL 不会影响性能。此时,增加的并发能力可以处理更多数据包,尽管没有真正的并行性,但能有效提升程序性能(每秒可服务更多客户端),不过每个任务的执行时间不变。
2. Python 中的线程
2.1 线程基础
线程由开始、执行序列和结束组成,还有一个指令指针,用于跟踪线程在其上下文中的当前运行位置。该指针可以被抢占或中断以停止线程,也可以暂时挂起,即让线程进入休眠状态。
在 Python 中处理线程有两种选择:
- thread 模块 :提供了一些有限的线程处理能力,使用简单,对于小任务,带来的开销较小。