Python——全局解释器锁


什么是 GIL?

  • 全局解释器锁(Global Interpreter Lock,GIL)是 Python 解释器(如 CPython)中的一个机制,它确保在同一时刻只有一个线程执行 Python 字节码
  • GIL 的存在意味着:即使在多核处理器上多个线程无法真正并行执行 Python 代码

GIL 存在的原因

  • GIL 的存在主要是为了保护 Python 解释器的内部状态,避免多线程同时修改导致的数据竞争问题
  • 由于 Python 的内存管理不是线程安全的,GIL 提供了一种简单的解决方案来保证线程安全

GIL对多线程的影响

  • GIL对多线程程序的影响取决于线程执行的任务类型:
    • CPU密集型任务 :这类任务主要是进行大量的计算,需要频繁使用CPU
      • GIL使得,即使使用多线程,多个 CPU 核心也无法同时执行 Python 代码
      • 多线程在 CPU 密集型任务上的表现可能比单线程更差,因为线程切换会带来额外的开销
    • I/O密集型任务 :这类任务主要是进行输入输出操作,如网络请求、文件读写等
      • 在执行 I/O 操作时,线程会释放 GIL,允许其他线程执行
      • 多线程在I/O密集型任务上可以显著提高性能

如何规避 GIL 的限制

  • 使用多进程(常用)multiprocessing模块允许创建多个进程,每个进程都有自己的 Python 解释器和 GIL,因此可以真正并行执行 CPU 密集型任务
  • 使用 C 扩展(不常用) :将关键部分的代码用 C 语言实现,并在 C 扩展中释放 GIL。这样可以让C代码在多核处理器上并行执行