GIL锁(全局解释器锁)(线程)

什么是GIL锁?

1.GIL是Python解释层面的锁,解决解释器中多个线程的竞争资源问题(多个子线程在系统资源竞争是,都在等待对象某个部分资源解除占用状态,结果谁也不愿意先解锁,然后互相等着,程序无法执行下去)。

2.在Cpython解释器下,GIL(全局解释器锁)导致了同一进程下的多个线程不能利用多核

如何改善GIL产生的问题

因为 GIL 锁是解释器层面的锁,无法去除 GIL 锁在执行程序时带来的问题。只能去改善。

1.更换更高版本的解释器,比如3.6,从3.2版本开始,据说Python对解释做了优化

2.更换解释器,比如JPython,但是由于比较小众,支持的模块较少,导致开发的效率降低

3.Python为了解决程序使用多核的问题,使用多进程代替多线程

Gil全局解释锁延伸扩展

GIL:全局解释器锁。当我们使用多线程的时候,每一个进程中只有一个GIL锁,那么这多个线程中谁拿到GIL锁,谁就可以使用cpu(ps:多个进程有多个Gil锁,但每个进程中只有一个GIL),所以当python用cpython作为解释器的时候,多线程就不是真正意义上的多线程,属于伪并发的多线程。

什么时候会释放Gil锁

  1. 遇到像 i/o操作这种 会有时间空闲情况 造成cpu闲置的情况会释放Gil
  2. 会有一个专门ticks进行计数 一旦ticks数值达到100这个时候释放Gil锁 线程之间开始竞争Gil锁(说明:ticks这个数值可以进行设置来延长或者缩减获得Gil锁的线程使用cpu的时间)

总结

1. 线程锁是fine-grained(细粒度)的锁,程序员需要自行加/解锁来保证线程安全;

2. 全局解释锁是coarse-grained(粗粒度)的锁,语言层面本身维护着一个全局的锁机制用来保证线程安全;

3. 前一种方式比较典型的是 Java, Jython 等, 后一种方式比较典型的是 CPython (即Python)。