Python 之 GIL 全局解释器锁

GIL(全局解释器锁)

GIL锁即全局解释器锁,是 CPython 解释器的特性。它的作用是保证了同一时刻只有一个线程执行 Python 字节码。

它并不是 Python 的特性,它的存在是 CPython 的内存管理机制导致的。语言的内存管理机制一般有两种:1.引用计数 2.垃圾回收。CPython 用的就是引用计数来管理内存。当一个资源的引用次数为0时,就将这个对象释放。如果没有 GIL 锁,在多线程中即时简单的操作也可能引起变量被多个线程同时修改,这样显然会容易出错。

那么 GIL 锁会导致运行时间变慢吗?首先对单线程的程序自然没有影响,甚至还提升了效率。对多线程的程序显然会有影响。但是也要看多线程的程序类型。

如果是IO密集型的程序,当前拥有锁的程序会先释放锁,然后执行IO操作,然后再获取锁。线程在释放锁时会把当前线程状态存在一个全局变量PThreadState的数据结构中,当线程获取到锁之后恢复之前的线程状态。所以GIL对IO密集型的程序还是很友好的。

如果是CPU密集型的程序,它并不会像IO密集型程序那样主动释放锁给其他线程。所以 CPython 中就会每执行0.05秒就强制释放锁来实现线程切换。

那么在高并发情况下要加快处理速度就需要用到另一个概念:多进程。

也有很多Python开发者努力想要去除GIL锁,但是为了保证多线程安全运行效率反而更低了。



RLock(递归锁)

为了支持在同一线程中多次请求同一资源,python提供了"递归锁":threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次acquire。直到一个线程所有的acquire都被release,其他的线程才能获得资源。

原文地址:https://www.cnblogs.com/ITs-WHY/p/11576745.html

时间: 2024-07-30 12:08:33

Python 之 GIL 全局解释器锁的相关文章

Python 36 GIL全局解释器锁

一:GIL全局解释器锁介绍 在CPython中,全局解释器锁(或GIL)是一个互斥锁, 它阻止多个本机线程同时执行Python字节码.译文:之所以需要这个锁, 主要是因为CPython的内存管理不是线程安全的.(然而,由于GIL的存在, 其他特性已经变得依赖于它所执行的保证.) 1. 什么是GIL全局解释器锁GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线程无法实现并行

Python之路-python(paramiko,进程和线程的区别,GIL全局解释器锁,线程,进程)

一.paramiko 二.进程.与线程区别 三.python GIL全局解释器锁 四.线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 一.paramiko 用于远程连接并执行简单的命令 使用用户名密码连接: 1 import paramiko 2 3 # 创建SSH对象 4 ssh = paramiko.SSHClient() 5 # 允许连接不在know_hosts文件中的主机 6 ssh.set

python第三十七天,GIL全局解释器锁*****,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe

python GIL全局解释器锁与互斥锁 目录

python 并发编程 多线程 GIL全局解释器锁基本概念 原文地址:https://www.cnblogs.com/mingerlcm/p/11063837.html

python 并发编程 多线程 GIL全局解释器锁基本概念

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

GIL(全局解释器锁)

GIL(全局解释器锁) 我们知道多进程(mutilprocess) 和 多线程(threading)的目的是用来被多颗CPU进行访问, 提高程序的执行效率. 但是在python内部存在一种机制(GIL),在多线程 时同一时刻只允许一个线程来访问CPU. GIL 并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编译器例如GCC,INTEL C++,Visual C++等.

GIL全局解释器锁和进程池.线程池

GIL全局解释器锁 GIL本质就是一把互斥锁,是夹在解释器身上的,同一个进程内的所有线程都需要先抢到GIl锁,才能执行解释器代码 GIL的优缺点: 优点:保证Cpython解释器内存管理的线程安全 缺点:同一个进程内所有的线程同一时刻只能有一个执行,也就是说Cpython解释器的多线程无法实现并行,无法取得多核优势 GIL与单线程 每个进程的内存空间中都有一份python解释器的代码,所以在单线程的情况下,GIL锁没有线程争抢,只有垃圾回收机制线程会定时获取GIL权限 GIL与多线程 有了GIL

GIL全局解释器锁

1.什么是GIL全局解释器锁? GIL并不是Python的特性,而是CPython解释器的概念.Python完全可以不依赖于GIL. GIL本质是一把互斥锁,是加在CPython解释器身上的,同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码 2.为什么会有GIL? 为了利用多核,Python开始支持多线程,而解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁,于是有了GIL这把超级大锁. 简单的说GIL的存在更多的是历史原因. 3.GIL的影响 GIL的存在会对多线程的效率

10 并发编程-(线程)-GIL全局解释器锁&死锁与递归锁

一.GIL全局解释器锁 1.引子 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念. 就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.>有名的编译器例如GCC,INTEL C++,Visual C++等.Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行