分析GIL全局解析器锁

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kun1280437633/article/details/79490052

#    要想了解GIL,首先要知道什么是并行和并发?

    1.并发:进行交替处理多件事情。

    2.并行:多个cpu同时处理多个事,只在多核上能实现。

#    然后,我们要知道为什么会产生GIL?

    解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。 于是有了GIL这把超级大锁,当时Guido van Rossum(吉多·范罗苏姆)创建python时就只考虑到单核cpu , cpython解析只允许拥有GIL全局解析器锁才能运行程序,保证同一个时刻只允许一个线程可以使用cpu,大量的程序开发者接收了这套机制,现在代码量越来越多,已经不容易通过c代码去解决这个问题。

#    什么是GIL?

     GIL是全局解析器锁,保证同一时刻只有一个线程可以使用cpu,让我们的多线程没办法真正实现并行。(解释 : 当我们使用多线程的时候,在一个进程中只有一个GIL锁,那么这多个线程中谁拿到GIL谁就可以使用cpu(ps:多个进程有多个GIL锁))

#    什么时候会释放GIL锁?

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

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

#    怎么解决GIL?

    1、更换cpython为jpython(不建议),比较慢 

    2、使用多进程完成多线程的任务

    3、在使用多线程可以使用c语言去实现 

#    互斥锁和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必定拿到GiIL,如果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进行修改


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值