精华内容
下载资源
问答
  • GIL锁

    2019-09-09 16:24:39
    GIL锁 何为 GIL 锁? 全局解释器锁(英語:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。 即便在多核心处理器上,使用GIL 的解释器...

    GIL锁

    何为 GIL 锁?

    全局解释器锁(英語:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。 即便在多核心处理器上,使用GIL 的解释器也只允许同一时间执行一个线程。 常见的使用GIL 的解释器有CPython与Ruby MRI。

    在Python多线程下,每个线程的执行方式:

    1.获取GIL
    2.执行代码直到sleep或者是python虚拟机将其挂起。
    3.释放GIL

    GIL存在的意义?

    因为python的线程是调用操作系统的原生线程,这个原生线程就是C语言写的原生线程。因为python是用C写的,启动的时候就是调用的C语言的接口。因为启动的C语言的远程线程,那它要调这个线程去执行任务就必须知道上下文,所以python要去调C语言的接口的线程,必须要把这个上限问关系传给python,那就变成了一个我在加减的时候要让程序串行才能一次计算。就是先让线程1,再让线程2…

    每个线程在执行的过程中,python解释器是控制不了的,因为是调的C语言的接口,超出了python的控制范围,python的控制范围是只在python解释器这一层,所以python控制不了C接口,它只能等结果。所以它不能控制让哪个线程先执行,因为是一块调用的,只要一执行,就是等结果,这个时候4个线程独自执行,所以结果就不一定正确了。有了GIL,就可以在同一时间只有一个线程能够工作。虽然这4个线程都启动了,但是同一时间我只能让一个线程拿到这个数据。其他的几个都干等。python启动的4个线程确确实实落到了这4个cpu上,但是为了避免出错。这也是Cpython的一个缺陷,其他语言没有,仅仅只是Cpython有。

    线程互斥锁和GIL的区别

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

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

    GIL锁关系图

    GIL(全局解释器锁)是加在python解释器里面的,效果如图:
    在这里插入图片描述

    如上图,为什么GIL锁要加在python解释器这一层,而却不加在其他地方?

    因为你python调用的所有线程都是原生线程。原生线程是通过C语言提供原生接口,相当于C语言的一个函数。你一调它,你就控制不了了它了,就必须等它给你返回结果。只要已通过python虚拟机,再往下就不受python控制了,就是C语言自己控制了。你加在python虚拟机以下,你是加不上去的。同一时间,只有一个线程穿过这个锁去真正执行。其他的线程,只能在python虚拟机这边等待。

    总结

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

    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的多线程就完全没用了呢?

    在这里我们进行分类讨论:

    1、CPU密集型代码(各种循环处理、计数等等),在这种情况下,ticks计数很快就会达到阈值,然后触发GIL的释放与再竞争(多个线程来回切换当然是需要消耗资源的),所以python下的多线程对CPU密集型代码并不友好。

    2、IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。所以python的多线程对IO密集型代码比较友好。

    而在python3.x中,GIL不使用ticks计数,改为使用计时器(执行时间达到阈值后,当前线程释放GIL),这样对CPU密集型程序更加友好,但依然没有解决GIL导致的同一时间只能执行一个线程的问题,所以效率依然不尽如人意。

    多核多线程比单核多线程更差,原因是单核下多线程,每次释放GIL,唤醒的那个线程都能获取到GIL锁,所以能够无缝执行,但多核下,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸(thrashing),导致效率更低

    回到最开始的问题:经常我们会听到老手说:“python下想要充分利用多核CPU,就用多进程”,原因是什么呢?

    原因是:每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。

    所以我们能够得出结论:多核下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率

    展开全文
  • gil锁

    2019-09-25 14:11:19
    熟悉python的都知道,在C语言写的python解释器中存在全局解释器,由于...python GIL 之所以会影响多线程等性能,是因为在多线程的情况下,只有当线程获得了一个全局的时候,那么该线程的代码才能运行,而全局...

    熟悉python的都知道,在C语言写的python解释器中存在全局解释器锁,由于全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能。而这个解释器锁由于历史原因,现在几乎无法消除。

    python GIL 之所以会影响多线程等性能,是因为在多线程的情况下,只有当线程获得了一个全局锁的时候,那么该线程的代码才能运行,而全局锁只有一个,所以使用python多线程,在同一时刻也只有一个线程在运行,因此在即使在多核的情况下也只能发挥出单核的性能。

    既然python在同一时刻下只能运行一个线程的代码,那线程之间是如何调度的呢? 

    对于有io操作的线程,当一个线程在做io操作的时候,因为io操作不需要cpu,所以,这个时候,python会释放python全局锁,这样其他需要运行的线程就会使用该锁。 

    对于cpu密集型的线程,比如一个线程可能一直需要使用cpu做计算,那么python中会有一个执行指令的计数器,当一个线程执行了一定数量的指令时,该线程就会停止执行并让出当前的锁,这样其他的线程就可以执行代码了。 

    由上面可知,至少有两种情况python会做线程切换,一是一但有IO操作时,会有线程切换,二是当一个线程连续执行了一定数量的指令时,会出现线程切换。当然此处的线程切换不一定就一定会切换到其他线程执行,因为如果当前线程 优先级比较高的话,可能在让出锁以后,又继续获得锁,并优先执行。

    在做科学计算的时候是用的单线程,因为这种计算是需要CPU一直做计算的,如果用多线程反而会降低计算速度。



    作者:Gambler_194b
    链接:https://www.jianshu.com/p/c75ed8a6e9af
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    转载于:https://www.cnblogs.com/qj696/p/10871186.html

    展开全文
  • GIL

    2018-05-04 14:39:00
    1.同步(掌握) 2.死锁,递归(掌握) 3同步对象,信号量(了解) 4 队列(重点)----生产者,消费者模型的创建 5 进程(重点) 并发&并行 并发:是指系统具有处理多个任务(动作)的能力 ...

    ---恢复内容开始---

    1.同步锁(掌握)

     

    2.死锁,递归锁(掌握)

     

    3同步对象,信号量(了解)

     

    4 队列(重点)----生产者,消费者模型的创建

     

    5 进程(重点)

     

    并发&并行

    并发:是指系统具有处理多个任务(动作)的能力

    并行:是指系统具有 同时  处理多个任务(动作)的能力

    并行是并发的一个子集

     

     

    同步  与  异步

    同步:当进程执行到一个IO操作(等待外部数据)的时候你,--------等:同步

    异步:                        ---------不等:异步,一直等到数据接收成功,再回来处理

    异步的执行效率要比同步的高

     

     

    问题:开多线程时,多核没有用上

     

    GIL:全局解释锁

      因为有GIL,所以,同一时刻,只有一个线程被cpu执行

     

    处理方法:多进程+协程

     

    任务种类:IO密集型  

          计算密集型

    对于IO密集型的任务,Python的多线程时有意义的

              可以采用多进程+协程

    对计算密集型的任务,Python的多线程就不推荐,Python就不适用了

     

     

     

    协程:  协作式,-------非抢占式的程序。线程进程都是程序自己切换的。协程是有程序员编码时自己来决定何时切换

       协程本质上就是一个线程

      优点:1.没有切换的消耗,2,没有锁的概念

      缺点:不能用多核。但可以用多进程+协程来解决此问题

     

    yield(协程)

    用户态切换

    key:什么时候切换

    转载于:https://www.cnblogs.com/lhqlhq/p/8990531.html

    展开全文
  • python gil锁_Python GIL锁

    2020-11-28 22:27:59
    而多个线程又都要共享Cpython的解释权限,共享意味着竞争,有竞争数据就不安全,所以Cpython的GIL锁(Cpython的一个线程)就产生了,根本作用是,当python文件中的线程想要执行其代码,必须获得GIL权限,否则不能...

    Cpython进程与其运行文件所产生的主进程是一个进程(文件进程相当于Cpython的一个线程)

    线程的特点是数据资源是共享的,而多个线程又都要共享Cpython的解释权限,共享意味着竞争,有竞争数据就不安全,

    所以Cpython的GIL锁(Cpython的一个线程)

    就产生了,根本作用是,当python文件中的线程想要执行其代码,必须获得GIL权限,否则不能执行,

    所以cpu的多核优势也没有了,除非多开Cpython解释器或多进程,否则同时只能运行一个线程

    1436409-20190904105418256-1075370116.png

    一个工人相当于cpu,此时计算相当于工人在干活,I/O阻塞相当于为工人干活提供所需原材料的过程,工人干活的过程中如果没有原材料了,则工人干活的过程需要停止,直到等待原材料的到来。

    如果你的工厂干的大多数任务都要有准备原材料的过程(I/O密集型),那么你有再多的工人,意义也不大,还不如一个人,在等材料的过程中让工人去干别的活,

    反过来讲,如果你的工厂原材料都齐全,那当然是工人越多,效率越高

    结论:

    对计算来说,cpu越多越好,但是对于I/O来说,再多的cpu也没用

    当然对运行一个程序来说,随着cpu的增多执行效率肯定会有所提高(不管提高幅度多大,总会有所提高),这是因为一个程序基本上不会是纯计算或者纯I/O,所以我们只能相对的去看一个程序到底是计算密集型还是I/O密集型,从而进一步分析python的多线程到底有无用武之地。

    多线程用于IO密集型,如socket,爬虫,web

    多进程用于计算密集型,如金融分析

    展开全文
  • 但是,其实Python的CPython(C语言实现的)解释器上有一把GIL锁,也就是说Python的程序是处于一个解释器锁的环境中的。一、GIL介绍GIL (Global Interperter Lock) 称作全局解释器锁。GIL并不是Pytho...
  • Python GIL锁 互斥锁

    2021-01-19 11:28:56
    Python GIL锁 互斥锁 GIL锁是什么 GIL(Global Interperter Lock)称为全局解释器锁,并不是python语言独有的,而是python的常用解释器cpython上存在的(jython即java写成的python解释器没有) 互斥锁是什么 python...
  • python GIL锁

    2019-09-25 10:58:38
    Python的GIL锁  python的GIL锁是什么?  python内置的一个全局解释器锁,锁的作用就是保证同一时刻一个进程中只有一个县城可以被cpu调度.  为什么有着吧GIL锁?  python语言的创始人在开发这门语言时,目的是...
  • 主要介绍了Python Threading 线程/互斥锁/死锁/GIL锁的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • GIL锁和用户锁

    2019-08-04 17:16:00
    GIL锁和用户锁(Global Interpreter Lock 全局解释器锁) 1.全局解释器锁: 保证同意时间仅有一个线程对资源有操作权限 ​ 作用:在一个进程内,同一时刻只能有一个线程通过GIL锁被CPU调用,切换条件:I/O操作、...
  • GIL锁的问题

    2020-12-02 20:53:45
    目录一:并发与并行:二:进程与线程:三:GIL锁的介绍:1:引入GIL锁的原因?四:面试问题:1:GIL锁优点和缺点?2:有了GIL锁是否意味着线程就安全了?3:互斥锁和GIL锁的区别?4:如何改善GIL锁带来的问题?5:...
  • python gil锁_python--GIL锁

    2020-11-28 22:28:59
    GIL介绍GIL本质就是一把互斥,既然是互斥,所有互斥的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。可以肯定的一点是:保护不同的数据的...
  • 一、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 ...
  • python gil锁_python GIL锁

    2020-11-28 22:29:00
    为什么要有GILGILGIL(global interpreter lock),全局解释器,是很多编程语言实现中都具有的特性,由于它的存在,解释器无法实现真正的并发。它也是 Python 中经常讨论的话题之一。Python 作为编程语言存在多个...
  • Python中GIL锁

    2019-12-30 10:19:32
    GIL锁:全局解释锁,是cpython解释器独有的; GIL锁的缺点: GIL锁在多线程执行时,只有一个线程使用CPU,使得无法利用多核CPU,也称为(伪线程); GIL锁释放时机:一般在进行IO操作时,需要进行大量时间进行等待,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,995
精华内容 5,198
关键字:

gil锁