117 GIL全局解释器锁

1、GIL全局解释器锁

cpython中自带的GIL全局解释器,GIL自己就是一把互斥锁python

重点:由于有了GIL全局解释器锁,致使了在同一进程的同一时刻只有一个线程在执行,没法利用多核优点程序员

其实就算咱们在程序中写了一个线程的并行操做,实际上GIL会由于垃圾回收机制的问题,操做系统调度的问题,会把并行的线程仍是变成了串行,这正是这个GIL全局解释器锁致使了同一进程的同一时刻只有一个线程在运行,安全

Python代码的执行由Python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行。虽然 Python 解释器中能够“运行”多个线程,但在任意时刻只有一个线程在解释器中运行。多线程

对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。函数

在多线程环境中,Python 虚拟机按如下方式执行:操作系统

  1. 设置 GIL;
  2. 切换到一个线程去运行;
  3. 运行指定数量的字节码指令或者线程主动让出控制(能够调用 time.sleep(0));
  4. 把线程设置为睡眠状态;
  5. 解锁 GIL;
  6. 再次重复以上全部步骤。

在调用外部代码(如 C/C++扩展函数)的时候,GIL将会被锁定,直到这个函数结束为止(因为在这期间没有Python的字节码被运行,因此不会作线程切换)编写扩展的程序员能够主动解锁GIL。线程

2、为何要有GIL全局解释器锁

由于cpython自带的垃圾回收机制不是线程安全的,因此要有GIL锁.设计

致使了同一个进程下,同一时间只能运行一个线程,没法利用多核优点.code