多进程、多线程与协程

多进程与多线程的用处

多进程用于大量CPU计算,多线程用于大量I/O操作

Python鼓励使用多进程,因为python里有个GIL全局解释锁,它在很多时候都会加GIL,导致线程被独占,从而无法实现多线程并发,并且还会导致CPU的多数性能利用不上,除非你的程序是需要大量I/O操作的时候

为什么会有GIL全局解释锁:因为Python的解释器CPython内部运行多个线程的时候,每个线程都需要向解释器申请相应的全局资源,由于C语言本身比较底层,造成CPython在管理所有全局资源时并不能应对所有线程同时的资源请求,因此为了防止资源竞争而发生错误,对所有线程申请全局资源增加了限制-全局解释器锁

多进程

基本概念

进程定义:

程序关于某数据集合的一次运行

它包含三要素,第一要是程序,第二要有数据,第三要运行起来

进程是资源分配的最小单位

进程的五种状态

创建:运行某程序,就创建了一个进程

就绪:由于一个CPU在一段时间内只能执行一个程序,所以,当启动了两个进程A和B,CPU正在运行进程B时,进程A就处于就绪状态,时刻等待CPU有空闲来运行自己

运行:进程在被CPU运行过程中

阻塞:当进程A需要由其他设备来运行时,如向磁盘写数据(由磁盘来运行)、进行网络通讯(由网卡来运行)、与IO设备产生关系(接受键盘写入、通过显卡或声卡向外展示等)、等待其他进程返回值等操作时,此时进程并不由CPU来运行,那么此时CPU会放弃运行进程A,先去运行其他进程。此时,进程A就处于阻塞状态

结束:程序被关闭,进程结束

另注:有时候,程序被关闭后,相关的进程未结束,这就形成了僵尸进程

同步与异步、阻塞与非阻塞

同步是指一个进程完了再执行下一个进程

异步是指两个进程之间没有任何关系

阻塞就是进程的五种状态中的第三种,非阻塞就是不在阻塞状态时

只有异步非阻塞才是有意义的多进程,如果是异步阻塞,那么就意味着两个进程,其中一个处在阻塞状态,那么此时CPU仍然只能执行一个进程,如果是同步,不论阻塞或非阻塞,都是执行完一个进程再执行下一个进程,与多进程没什么关系

CPU的组成

运算器:用于各种数学计算及逻辑计算

控制器:负责从内存或硬盘的虚拟内存里调取指令,并按顺序向其他硬件设备发送指令,协调和指挥整个计算机的运行

寄存器:CPU自带的缓存,用于存储运算时的数据,我们通常说的二级缓存、三级缓存等就是指寄存器

进程的上下文

进程在某一时刻运行的状态和数据的记录就是上下文。如:当进程运行到程序的第五行时,CPU分给该进程的轮询时间已到,CPU停止执行该进程而去执行其他进程,此时,就会在CPU的寄存器里生成该进程的上下文,以便CPU再次轮询到该进程时能够从刚才停止的位置继续执行

进程切换

由于一个CPU在某一个时间段只能运行一个进程,所以当多个进程需要运行时,CPU就会轮询着运行,执行进程A 5毫秒后切换执行进程B 5毫秒,再切换进程C 5毫秒……,最后再切换会A执行5毫秒……,这个切换的动作就叫做进程切换