Python_全局解释器锁GIL

Python的全局解释器锁(GIL)确保了在同一时刻只有一个线程执行Python字节码。在多线程环境中,GIL会按照一定步骤交替执行线程,对于I/O密集型任务有益,但在CPU密集型任务中限制了并行计算。为缓解GIL的影响,可以使用多进程或协程。协程避免了线程切换的开销,提高了性能。
摘要由CSDN通过智能技术生成

GIL概念

Python代码的执行由Python虚拟机(也叫解释器主循环,CPython版本)来控制,Python在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。 对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。

在多线程环境中,Python虚拟机按以下方式执行:

  1. 设置GIL。
  2. 切换到一个线程去执行。
  3. 运行:a.指定数量的字节码指令,或者b.线程主动让出控制(可以调用time.sleep())
  4. 把线程设置为睡眠状态。
  5. 解锁GIL。
  6. 再次重复以上所有步骤。

在调用外部代码(如C/C++扩展函数)的时候,GIL将会被锁定,直到这个函数结束为止(由于在这期间没有Python的字节码被运行,所以不会做线程切换)。

GIL的特点

对于I/O密集型任务,Python的多线程起到作用,但对于CPU密集型任务,Python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。

具体如下所示:

在做I/O操作时,GIL总是会被释放,对所有面向I/O的(会调用内建的操作系统C代码的)程序来说,GIL会在这个I/O调用之前被释放,以允许其它的线程在这个线程等待I/O的时候运行。

如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁,让别的线程有机会执行(这个次数可以通过 sys.setcheckinterval 来调整)如果某线程并未使用很多I/O 操作,它会在自己的时间片内一直占用处理器(和GIL)。

缓解GIL锁的方法

解决方法就是多进程和协程(协程也只是单CPU,但是能减小切换代价提升性能)。

协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态。

Python里最常见的yield就是协程的思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocky Ding*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值