黑马程序员技术交流社区

标题: 【广州Python】进程、线程、协程和GIL [打印本页]

作者: yangrui    时间: 2018-11-29 10:40
标题: 【广州Python】进程、线程、协程和GIL
本帖最后由 yangrui 于 2018-11-29 10:42 编辑

进程
       进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
线程
       线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。
       线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。线程没有自己的系统资源。
进程和线程的关系
       1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
       2. 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
       3. CPU分给线程,即真正在CPU上运行的是线程。
协程
       协程,又称微线程,协程是python个中另外一种实现多任务的方式,通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。
进程、线程、协程关系
       1. 进程是操作系统资源分配的单位
       2. 线程是CPU调度的单位
       3. 进程切换需要的资源最大,效率很低
       4. 线程切换需要的资源一般,效率一般(当然在不考虑GIL的情况下)
       5. 协程切换任务资源很小,效率高
       6. 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发
GIL
       1. GIL,全局解释器锁(globalinterpreter lock),它是cpython解析器的特性,不是python的特性 ,它要求线程在执行前,需要获取GIL锁,
       2. 由于GIL的存在,会影响多线程不能利用多核CPU资源,通过多进程+多协程方式可利用多核CPU资源
       3. 线程释放GIL锁的情况:
              (1)在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL
              (2)Python3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)
       4. 多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁,这样在线程阻塞情况下,可以执行其他线程中的代码
       5. 如果对并行计算性能较高的程序可以考虑把核心部分写成C模块。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2