GIL锁

作者: 初幕 | 来源:发表于2018-05-10 17:06 被阅读0次

Gil全局解释锁延伸扩展

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

问题1: 什么时候会释放Gil锁

1. 遇到像 i/o操作这种 会有时间空闲情况 造成cpu闲置的情况会释放Gil 

2. 会有一个专门ticks进行计数 一旦ticks数值达到100这个时候释放Gil锁 线程之间开始竞争Gil锁(说明:ticks这个数值可以进行设置来延长或者缩减获得Gil锁的线程使用cpu的时间)

问题2: 互斥锁和Gil锁的关系

- Gil锁 :保证同一时刻只有一个线程能使用到cpu

- 互斥锁 : 多线程时,保证修改共享数据时有序的修改,不会产生数据修改混乱

- 首先假设只有一个进程,这个进程中有两个线程 Thread1,Thread2, 要修改共享的数据date, 并且有互斥锁:

  执行以下步骤:

多线程运行,假设Thread1获得GIL可以使用cpu,这时Thread1获得 互斥锁lock,Thread1可以改date数据(但并没有开始修改数据);

Thread1线程在修改date数据前发生了 i/o操作 或者 ticks计数满100((注意就是没有运行到修改data数据),这个时候 Thread1 让出了Gil,Gil锁可以被竞争);

Thread1 和 Thread2 开始竞争Gil (注意:如果Thread1是因为i/o 阻塞 让出的Gil,Thread2必定拿到Gil,如果Thread1是因为ticks计数满100让出Gil这个时候Thread1 和 Thread2 公平竞争);

假设 Thread2正好获得了GIL, 运行代码去修改共享数据date,由于Thread1有互斥锁lock,所以Thread2无法更改共享数据date,这时Thread2让出Gil锁, GIL锁再次发生竞争;

假设Thread1又抢到GIL,由于其有互斥锁Lock所以其可以继续修改共享数据data,当Thread1修改完数据释放互斥锁lock,Thread2在获得GIL与lock后才可对data进行修改 

以上描述了互斥锁和Gil锁的 一个关系。 

总结:

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

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

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

相关文章

  • Python中的GIL锁

    1、什么是GIL锁: GIL的全称是Global Interpreter Lock(全局解释器锁),GIL...

  • python中的GIL详解

    原文链接 GIL并不是Python的特性,Python完全可以不依赖于GIL。 ​ GIL 锁: 全局解释器锁,作...

  • Python GIL 机制

    Python GIL(Global Interpreter Lock) 解释器锁 GIL本质就是一把互斥锁,将并发...

  • ThreadPoolExecutor 线程池的使用

    写在前面:GIL锁 关于GIL锁:多线程在Python中并不一定是鸡肋CPython解释器存在GIL锁,一次只允许...

  • GIL下的多线程

    1. GIL GIL 是什么? GIL 全称 Global Interpreter Lock,全局解释锁。存在于 ...

  • 008 12. python提高-1

    12.1. GIL GIL(全局解释器锁) GIL面试题如下 描述Python GIL的概念, 以及它对pytho...

  • GIL锁

    Gil全局解释锁延伸扩展 GIL:全局解释器锁。当我们使用多线程的时候,每一个进程中只有一个GIL锁,那么这多个线...

  • GIL 全局解释器锁

    一. 什么是GIL全局解释器锁 GIL 本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL锁,同一进...

  • Python 并发总结

    0x01 GIL锁 C语言写的Python解释器存在全局解释器锁GIL(Global Interpreter Lo...

  • python多线程

    python基础之多线程锁机制 GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析...

网友评论

    本文标题:GIL锁

    本文链接:https://www.haomeiwen.com/subject/vtktdftx.html