GIL
只针对cpython解释器,只适用于cpython解释器,(pypy:没有gil锁)python出的时候,是单核cup,开启线程,垃圾回收,让其他线程停掉,只走垃圾回收线程,不会有并发问题
同一时刻,实际上只有一条线程在执行,有一把全局锁,只要线程执行,必须获得这把锁,才能执行
多核cpu出现,cpython,只能有一条线程执行,就是由于GIL锁的原因
python不能利用多核优势
想要分到不同cpu上执行,需要开进程(解释器进程),进程里最少有一条线程,开进程,非常耗资源
在某些情况下,并不是进程开的越多,程序执行越快
IO密集型,开线程,计算密集型,开进程 只适用于python
BIO
IO 操作本质
数据复制的过程中不会消耗CPU
# 1 内存分为内核缓冲区和用户缓冲区
# 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用
# 3 而IO操作、网络请求加载到内存的数据一开始是放在内核缓冲区的
AIO 是彻底的异步通信。
NIO 是同步非阻塞通信。
有一个经典的举例。烧开水。
假设有这么一个场景,有一排水壶(客户)在烧水。
AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。
IO 模型
BIO(Blocking IO) – 阻塞模式I/O
用户进程从发起请求,到最终拿到数据前,一直挂起等待; 数据会由用户进程完成拷贝
NIO(non-blocking) – 非阻塞模式I/O
用户进程发起请求,如果数据没有准备好,那么立刻告知用户进程未准备好;此时用户进程可选择继续发起请求、或者先去做其他事情,稍后再回来继续发请求,直到被告知数据准备完毕,可以开始接收为止; 数据会由用户进程完成拷贝
IO Multiplexing - I/O多路复用模型
类似BIO,只不过找了一个代理,来挂起等待,并能同时监听多个请求; 数据会由用户进程完成拷贝
AIO – 异步I/O模型
发起请求立刻得到回复,不用挂起等待; 数据会由内核进程主动完成拷贝
同步I/O 与 异步 I/O
- 同步I/O
- 概念:导致请求进程阻塞的I/O操作,直到I/O操作任务完成
- 类型:BIO、NIO、IO Multiplexing
- 异步I/O
- 概念:不导致进程阻塞的I/O操作
- 类型:AIO
注意:
- 同步I/O与异步I/O判断依据是,是否会导致用户进程阻塞
- BIO中socket直接阻塞等待(用户进程主动等待,并在拷贝时也等待)
- NIO中将数据从内核空间拷贝到用户空间时阻塞(用户进程主动询问,并在拷贝时等待)
- IO Multiplexing中select等函数为阻塞、拷贝数据时也阻塞(用户进程主动等待,并在拷贝时也等待)
- AIO中从始至终用户进程都没有阻塞(用户进程是被动的)