zoukankan      html  css  js  c++  java
  • python全局解释器GIL

    1、什么是进程:

      进程是竞争计算机资源的基本单位。对于单核CPU来讲,同一时间只能有一个进程在运行,所以当我们开启多个应用时,操作系统需要根据进程调度算法去在不同的应用程序之间切换,而不同的进程之间切换对于CPU的开销是非常大的。

      为了减少CPU的这种开销,更加充分的利用CPU的性能优势,出现了线程。

    2、线程:

      线程是进程的一部分,一个进程可以有一个或多个线程。

      线程是不负责管理和分配资源的,它负责利用CPU的资源去执行代码,所以线程之间的切换会比进程的切换开销小很多。

      进程是可以被分配资源的,线程可以访问进程的资源

    3、多线程:

      对于单核CPU,同一时刻只能有一个线程来执行,但是现在我们的电脑设备都是多核CPU,所以为了充分利用CPU的性能优势,我们会选择多线程或者多进程来开发。

      但是前面已经说了,多进程之间切换对于CPU的开销是巨大的,所以一般的应用程序开发会选择使用多线程来实现。

      python内置有多线程支持模块:_thread和threading,threading是高级模块,对_thread进行了封装。

      启动一个线程就是创建一个Thread实例,并将要执行的函数作为参数传递给Thread实例。

    4、GIL

      上面的一切看似很完美,但是很遗憾的是,python为了解决多线程之间数据的完整性和状态同步问题,python的解释器CPython中加了一把大锁GIL即全局解释器锁,它的作用在于,同一时刻只允许一个线程执行,不论计算机是几核。

      所以对于CPU密集型场景,python的多线程是没有意义的。

      但是对于IO密集型场景,python的多线程确实有意义的。

      原因在于,IO密集型大部分情况下是处于等待状态,比如一个请求发出去了,线程就空闲了,要等待返回结果之后,才会继续执行,所以这一段时间,CPU是空闲的,可以分配给别的线程来执行任务。

      

  • 相关阅读:
    An Introduction to the Linuxbased Assignments
    [读书笔记]Binary Hancks(1)
    haneWIN NFS Server
    [读书笔记]Binary Hancks(2) livepatch在X86下的实践
    CTNG编译错误以及解决办法
    [转]ucLinux下sqlite数据库移植全攻略
    程序员该有的艺术气质—SOLID原则
    Httpclient远程调用WebService示例(Eclipse+httpclient)
    四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
    全网首发:原创SQL数据库同步工具
  • 原文地址:https://www.cnblogs.com/fiona-zhong/p/10339050.html
Copyright © 2011-2022 走看看