全局解释器:GIL锁

Gil

全局解释器锁,每个线程在执行的过程中都需要先获取Gil, 保证同一时刻只有一个线程可以执行代码

  • 面试题:

描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因。

python中的gil锁就是全局解释器锁,保证同一时刻使用一个线程能使用到cpu,由于cpythont解释器的出现。 同一时刻只有一个线程使用cpu,这就造成不是百分百的情况使用cpu,多线程爬取比单线程性能有提升,因为遇到io阻塞会自动释放gil锁

Gil的延伸

作用 : 保证同一时刻只有一个线程能使用到cup 解释 : 当我们使用多线程的时候,在一个进程中只有一个GIL锁,那么这多个线程中谁拿到GIL谁就可以 使用cpu(ps:多个进程有多个Gil锁)

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

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

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

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

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

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

执行以下步骤

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/s201314yh/article/details/80025170