Python全局解释器锁GIL机制

发布时间 2023-11-22 13:53:01作者: 上好佳28

全局解释器锁

Global Interpreter Lock,CPython在解释器级别的一把锁,叫GIL全局解释器锁。

程序编译成字节码,程序想跑多线程,但是GIL保证CPython进程中,同一时刻只能有一个线程执行字节码。

所以,哪怕是在多CPU的情况下,即使每个线程恰好调度到了每个CPU上,有了这把大锁,同时只能有一个CPU使用CPython执行一个线程的字节码,其它线程只能阻塞等待

全局解释器锁实现为一种在CPython中提供线程安全内存管理的简单方法,只允许一次执行一个Python线程

IO密集型和CPU密集型任务

IO密集型,由于线程阻塞,就会调度其它线程;(wait会让出时间片,让其它线程有机会被调度、sleep不会),如大量使用网络IO、磁盘IO

CPU密集型,当前线程可能会连续的获得GIL,导致其它线程几乎无法使用CPU。(刚释放锁就又夺走了),大量占用CPU计算时间

对于IO密集型任务,GIL不会产生重大瓶颈,可以通过使用Python的线程模块实现多个并发线程来获得并行加速;

对于CPU密集型任务,受CPU限制并且大部分时间都在执行CPU密集型计算,那么GIL会对多线程性能产生负面影响,但有很多方法可以解决这个问题。

因为Python是一种解释型语言,它本身就很慢,所以处理器繁重的算法通常使用像C ++这样的更快的编译语言编写,然后Python程序可以调用包含他们的函数库中。这些操作可以使用并行线程在GIL的限制之外执行。

如果你想保留用Python编写的所有内容,解决方法是使用Python的多处理包来实现具有多个进程而不是多个线程的程序。每个Python进程都是它自己的Python解释器实例,它有自己的GIL,因此单独的进程可以并行执行。这里的缺点是进程之间的通信比线程之间的通信要复杂一些,创建多个进程比创建多个线程使用更多的系统资源