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一直做计算的,如果用多线程反而会降低计算速度。

  • 相关阅读:
    Redis和Memcache的区别分析
    javascript 与jquery为每个p标签增加onclick方法
    repeater单双行颜色不同,gridview repeater DataList 鼠标经过改变背景颜色
    sql 错误提示
    .net获取select控件中的文本内容
    您试图从目录中执行CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序
    html5 调用摄像头
    openfire配置MSSQL说明(数据库设置)
    Openfire 的安装和配置
    JS 等前端学习。
  • 原文地址:https://www.cnblogs.com/huanghongzheng/p/10982006.html
Copyright © 2011-2022 走看看