zoukankan      html  css  js  c++  java
  • GIL与池的定义问答

    """
    1、整理GIL解释器锁,解释以下问题
    1、什么是GIL
    是Cpython中的全局解释器锁,是一种互斥锁,是为了防止多个本地线程
    同一时间执行python字节码
    2、有了GIL会对单进程下的多个线程造成什么样的影响
    造成多线程不能并行执行
    3、为什么要有GIL
    因为Cpython的内存管理是非线程安全的,然而GIL尤其存在的必要性可以防止
    多个本地线程同一时间执行python字节码,同时已经存在很多代码需要依赖这个锁了
    4、GIL与自定义互斥锁的区别,多个线程争抢GIL与自定义互斥锁的过程分析
    他们都是互斥锁,但GIL是加在python解释器上的,只能锁住解释器内部的资源,但无法锁住我们
    自己开启的资源、自己开启的共享资源还需要自己锁
    但例如申请内存,保存数据等等就不需要我们程序员自己考虑了,GIL已经搞定了
    5、什么时候用python的多线程,什么时候用多进程,为什么?
    如果是IO密集时使用多线程如果时计算密集时使用多进程
    """
    """
    2、进程池与线程池
    1、池的用途,为何要用它
    池时一个容器,线程池就是装线程的容器,
    可以使用它来管理线程的开启与销毁
    自动分配任务给空闲的线程
    可以控制线程开启的数量,保证系统的稳定
    2、池子里什么时候装进程什么时候装线程?
    """

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

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

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

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

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

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

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

  • 相关阅读:
    OutputStream 和 Writer
    elasticsearch技术解析与实战(一) 入门和索引
    Kafka Consumer API样例
    关于kafka的新的group无法订阅到topic中历史消息的问题
    apache kafka系列之在zookeeper中存储结构
    KafkaConsumer 长时间地在poll(long )方法中阻塞
    问题记录
    java随笔
    Ubuntu18.10下运行blender2.80bate闪退(问题?)
    linux下简单制作iso,img镜像文件
  • 原文地址:https://www.cnblogs.com/huanghongzheng/p/10982006.html
Copyright © 2011-2022 走看看