• Python中的GIL锁


    在Python中,可以通过多进程、多线程和多协程来实现多任务。

    在多线程的实现过程中,为了避免出现资源竞争问题,可以使用互斥锁来使线程同步(按顺序)执行。

    但是,其实Python的CPython(C语言实现的)解释器上有一把GIL锁,也就是说Python的程序是处于一个解释器锁的环境中的。

    一、GIL介绍

    GIL (Global Interperter Lock) 称作全局解释器锁

    GIL并不是Python语言的特性,它是在实现Python解释器时引用的一个概念。GIL只在CPython解释器上存在。

    不过,在Python的解释器中,使用最多的都是CPython解释器,所以我们不可避免的会遇到GIL。

    在使用互斥锁解决代码中的资源竞争问题时,当一个线程执行时,会将全局共享的资源上锁,当线程执行完成后,将锁解开,释放资源,其他线程才能够使用。

    GIL的作用与互斥锁的作用相似,是为了解决解释器中多个线程资源竞争的问题。

    二、互斥锁和GIL的区别

    互斥锁是运用在一个py文件中的,也就是在一个应用程序中,是代码层面的锁。

    其实,Python解释器也是一个应用程序。只是说这个应用程序不是我们实现的,我们自己的python程序都要运行在解释器之上,这个应用程序被用来帮我们运行我们自己的程序。

    线程互斥锁是Python代码层面的锁,解决我们自己写的Python程序中多线程共享资源的问题。

    GIL是Python解释器层面的锁,解决解释器中多个线程的竞争资源问题。

    三、GIL对程序的影响

    1.Python中的多线程被称为“伪多线程”,因为无论如何,都逃不过GIL解释器锁。

    2.因为GIL的存在,在Python中同一时刻有且只有一个线程会执行。

    3.因为线程是存在于进程中的,线程是CPU调度和分派的基本单位,Python中的多线程由于GIL锁的存在无法利用多核 CPU。

    4.GIL在程序中有IO操作时才切换到其他线程,所以Python中的多线程不适合计算密集型的程序,只适合IO密集型的程序。

    既然GIL的存在使程序无法充分利用CPU进行运算,那么在IO密集型程序中为什么适合使用呢?

    通常,程序分为两种,一种是计算密集型程序,另一种叫作IO密集型程序。

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

    IO密集型程序在运行时,需要大量的时间进行等待,如果IO操作不完成,程序无法执行后面的操作,一直处于等待状态,导致CPU空闲。

    由于GIL的存在,同一时刻只能有一个线程执行,在程序进行IO操作时,CPU实际并没有做任何工作,程序执行效率非常低。

    为了提高CPU的使用率,Python解释在程序执行IO等待时,会释放GIL锁,让其它线程执行,提高Python程序的执行效率。

    所以,GIL对于IO密集型的影响很小,多线程适合用来做IO密集型的程序。

    四、如何改善GIL产生的问题

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

    1.更换更高版本的Python解释器,从3.2版本开始,Python开始对解释进行优化,虽然不能完全避开GIL,但是优化了总比优化前好。

    2.Python程序如果是计算密集型的,或者是需要使用多核CPU的程序,可以使用多进程替代多线程(增强硬件然后使用多进程)。

    3.GIL只存在于CPython解释器上,我们可以更换其他解释器,比如Jython(用JAVA实现的)。但是,由于使用的人少,支持的模块也较少,可能会导致有些模块不能使用,开发效率降低。一般不会采用这种方法。

    ————————————————
    版权声明:本文为CSDN博主「Python碎片」的原创文章
    原文链接:https://blog.csdn.net/weixin_43790276/article/details/91345641

  • 相关阅读:
    CSS Friendly Control Adapters CSSFriendly.dll
    2008秋季计算机软件基础未交实验报告名单
    About NeatHtml™ Brettle.Web.NeatHtml.dll
    What is DotNetOpenMail DotNetOpenMail.dll
    What is the simplest way to distribute a .NET COM server to any platform?
    页面压缩 Enabling Gzip and Deflate HTTP Compression in ASP.NET pages(转)
    [算法分析]计数排序
    [置顶] EJDesktop开源项目
    继承初体验
    [置顶] 基于stm32f103zet6之UC/OS_II的学习1(初步移植OS点灯大法)
  • 原文地址:https://www.cnblogs.com/testlearn/p/12327553.html
Copyright © 2020-2023  润新知