Python之GIL的理解总结

前言:并行和并发的区别,进程和线程,个人理解

并行:多个CPU同时执行两个程序,两个程序真的同时在运行。

并发:两个程序在一个CPU上执行,通过CPU时间片调度执行,执行的很快,看起来像并行,其实是并发,具体某一个时间点,一定只有一个程序在执行。

进程与线程:对于操作系统而言,一个任务就是一个进程,是拥有操作系统资源的最小单位;一个任务可以干多件事情,打字,拼写检查,打印等,把这些子任务叫线程,线程是进程执行运算的最小单位。所以,一个进程至少有一个线程,同一个进程中的线程共享资源。

两个进程同时死循环,会使两个CPU100%

多线程同时死循环,会使一个CPU100%,不会使两个CPU100%

Python的GIL:假设只有一个CPU的话,python的CPython解释器,在每个线程执行前都会获取GIL锁,保证同一时刻只有一个线程执行代码,所以,多线程并不是真正意义上的同时并行,而是并发。

如何解决GIL锁:

1.更换cpython为jpython,可行,不建议

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

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

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

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

会有一个ticks计数,ticks达到100,释放GIL,多线程竞争GIL锁,

问题:互斥锁和GIL锁:

Gil锁  : 保证同一时刻只有一个线程能使用到cpu
互斥锁 : 多线程时,保证修改共享数据时有序的修改,不会产生数据修改混乱

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进行修改
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值