【python】GIL

背景:

在CPython解释内部运行多个线程的时候,每个线程都需要解释器内部申请相应的全局资源,由于C语言本身比较底层造成CPython在管理所有全局资源的时候并不能应对所有线程同时的资源请求,因此为了防止资源竞争而发生错误,对所有线程申请全局资源增加了限制-全局解释器锁

首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。
就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。
Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL

GIL锁

一个进程有且仅有一个锁,该锁用于控制多线程同一时刻只能有一个线程使用CPU

锁的释放:

GIL锁的释放只需满足以下两个条件中的一个:

  1. 线程的时间片使用完毕(或者运行完一定行数的字节码)

  2. 线程遇到阻塞/等待的状态,此时即使时间片没有用完也会释放GIL锁

误区:

  • 有些人会有一个误区,认为一个线程完全执行完才会释放GIL锁给其他线程执行。

这样是错的,这样多线程就不是并发而是串行了。

  • 既然CPython解释存在GIL是否意味每个线程在全局变量就不用加Lock互斥锁了呢?

这是一个严重错误的想法,为什么用户操作全局数据还需要加Lock,因为GIL的释放时机我们无法控制-操作非常可能并没有完成,而不像Lock那样我们用完才释放(操作完整)

posted @ 2022-05-31 18:12  倒骑驴子  阅读(25)  评论(0编辑  收藏  举报