首页 > 编程语言 >python GIL全局解释器锁

python GIL全局解释器锁

时间:2022-09-29 17:57:21浏览次数:55  
标签:解释器 python 程序 Python 线程 IO GIL

全局解释器锁简称:GIL(Global Interperter Lock)。首先需要明确一点就是,GIL并不是Python语言的特性,它是在现实Python解释器时引用的一个概念。GIL只在CPython解释器上存在。作用是保证同一时间内只有一个线程在执行。

线程互斥锁和GIL的区别

1.线程互斥锁是Python代码层面的锁,解决Python程序中多线程共享资源的问题(线程数据共共享,当各个线程访问数据资源时会出现竞争状态,造成数据混乱);

2.GIL是Python解释层面的锁,解决解释器中多个线程的竞争资源问题(多个子线程在系统资源竞争是,都在等待对象某个部分资源解除占用状态,结果谁也不愿意先解锁,然后互相等着,程序无法执行下去)。

GIL对程序有啥影响

1.Python中同一时刻有且只有一个线程会执行;

2.Python中的多个线程由于GIL锁的存在无法利用多核CPU;

3.Python中的多线程不适合计算机密集型的程序;

4.如果程序需要大量的计算,利用多核CPU资源,可以使用多进程来解决。

GIL 的存在使程序无法充分利用CPU进行运算,那么它真的一无是处么? 再进一步分析,程序分为两种,一种是上面提到的计算密集型程序,另一种叫作IO密集型程序。

大部分的程序在运行时,都需要大量IO操作,比如网络数据的收发,大文件的读写,这样的程序称为IO密集型程序。

IO密集型程序在运行时,需要大量的时间进行等待,那么这时如果IO操作不完成,程序就无法执行后面的操作,导致CPU空闲。

那么 GIL 对于这种IO密集型程序会有什么影响?

在解释器解释执行任何 Python 代码时,都需要先获得这把锁才行,在遇到 I/O 操作时会释放这把锁。如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁,让别的线程有机会执行,提高Python程序的执行效率。

如何改善GIL产生的问题

因为 GIL 锁是解释器层面的锁,无法去除 GIL 锁在执行程序时带来的问题。只能去改善。

1.更换更高版本的解释器,比如3.6,从3.2版本开始,据说Python对解释做了优化

2.更换解释器,比如JPython,但是由于比较小众,支持的模块较少,导致开发的效率降低

3.Python为了解决程序使用多核的问题,使用多进程代替多线程

开了多个进程,就相当于启动了多个Python解释器,而GIL是CPython解释器里面的一个东西,现在解释器都有多个了,GIL当然也有多个,每个进程一个,实际上并没解决什么问题,那个进程仍然相当于只有一个线程,并发仅仅是通过进程实现的,仍然不能突破GIL

————————————————
版权声明:本文为CSDN博主「weixin_39653764」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39653764/article/details/114911079

标签:解释器,python,程序,Python,线程,IO,GIL
From: https://www.cnblogs.com/sunzhiqi/p/16742446.html

相关文章

  • python 线程
    1.1线程的背景知识importthreading#导入线程相关的模块t=threading.current_thread()#返回当前线程print(t)#主线程执行print(t.getName())#线程名字print......
  • python使用win32api进行后台窗口的部分截图函数
    defwindow_capture_beat(hwnd,stayx:int,endx:int,stay:int,endy:int):hwndDC=win32gui.GetWindowDC(hwnd)mfcDC=win32ui.CreateDCFromHandle(hwndDC)......
  • python 监控键盘事件
    frompynputimportkeyboard#按下后执行defon_press(key):try:ifkey==keyboard.KeyCode.from_char('enter'):passelifkey......
  • python5种线程锁
    # 线程安全线程安全是多线程或多进程编程中的一个概念,在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会......
  • python 生成伪随机数函数 random
    """random函数:出一个伪随机数具体怎么做?一般我们会考虑先查找python官方自带的文档在IDLE的右上角点击HELP-->PythonDoc(F1)-->点击左上角的索引-->输入我们要......
  • python dis模块
    python中的dis模块可以查看一句python代码的cpu运行轨迹,也就是cpu指令,如果只是读取数据时,如读取一个函数,此时数据是安全的,因为没有涉及任何修改,当改数据时,可能会涉及数据不......
  • 分分钟学会一门语言之Python篇
    github:原文#Singlelinecommentsstartwithahash.#单行注释由一个井号开头。"""Multilinestringscanbewrittenusingthree"'s,andareoftenusedas......
  • Python实现队列,堆栈
    一、队列classQueue:def__init__(self,size):self.size=sizeself.front=-1self.rear=-1self.queue=[]def......
  • python argparse使用及常用环境
    简介argparse是python中用来方便获取命令行参数的模块,也可以很方便的做一个简单的命令行参数的设定,例如ls-h等后面加参数的情况,可以自己创建一个支持命令行参数的命令......
  • python之第三方库pycurl库:PycURl是一个C语言写的libcurl的python绑定库。libcurl 是一
    ​​https://zhuanlan.zhihu.com/p/163173013​​​去期待陌生,去拥抱惊喜。......