python IO模式(多路复用和异步IO深入理解)
Posted 马里亚纳仰望星空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python IO模式(多路复用和异步IO深入理解)相关的知识,希望对你有一定的参考价值。
1、事件渠道模型。事件渠道为异步IO的原型。
2、IO模式,一次IO调用会经历两个阶段。一、等待数据阶段,将数据从网络或者是磁盘读取到系统内核(kennel) 二、将数据从内核拷贝到进程中。
基于这两个阶段,linux系统下面产生了五种网络网络模式方案。
-阻塞I/O(blocking IO)
-非阻塞I/O(nobokcing IO)
- I/O多路复用。(I/O multiplexing)
- 信号驱动
-异步I/O(async)
由于信号驱动使用较少,主要介绍其余四种模式。
3、阻塞I/O(blocking IO)在数据准备阶段和贝考数据阶段都会阻塞。用户调用recefrom 以后会一直等待数据拷贝到用户内存未至。
2、非阻塞I/O(nobokcing IO),用户会一直调用recefrom,如果数据没有准备好。会返回一个ERROR。一直到数据准备好。因此在读数据阶段不会卡住。
3、epoll模式,也就是IO多路复用模式。一次性可以处理多个网络IO。调用select方法。首先会卡住。直到其中一个有数据就会立即返回。然后拷贝数据。然后进入下一个循环
4、异步IO,异步I/O不会阻塞。当用户进程发起read操作以后。可以立刻开始做其他的事情(相当于告诉在内核注册一个事件。由内核进行监控,处理完以后内核主动通知)。而另一方面从kennel角度看当他收到一个async read以后,会立马回调。所以不会产生任何阻塞。当kennel准备好数据,将数据贝考到用户内存以后,会主动通知用户,告诉read操作已完成。
5、总结。
blocking IO 和 nonblocking IO 区别:
一、调用blocking IO 会一直阻塞,知道read全部完成为止。而 nonblocking IO 在ready会立即返回。相同点在于二者在coy阶段都会卡住。
async 和 synch的区别:
一、二者区别在于拷贝数据阶段是否会阻塞。所以上面的blocking IO、nonblocking IO、I/O多路复用都属于同步I/0。而async任何阶段不会阻塞。
6、select poll epoll区别。
select :他通过一个select()系统调用来监控多个文件描述符的数组。当select()返回以后,该文件描述符便会被内核修改表示位。使得进程可以获得文件描述符。从而进行后续读写操作。一、监视的文件描述符号存在最大数限制。可以通过修改内核参数来解决 2、由于select()会对所有的socket进行一次线性扫描。这也浪费了一定开销。随着文件描述符的增减。扫描时间线性增加。
poll:去掉了最大文件数限制。缺点和select一样。另外如果将就绪的文件告诉后台进程以后,进程没有读取。下次还会继续扫描。所以一般不会丢失消息。称之为水平触发。
epoll模式。用的最多的一种方式。同时支持水平触发和边缘触发(告诉进程描述符已经准备就绪,他只说一遍。如果程序未采取行动。下次将不会告知,这个叫边缘触发)。边缘触发较复杂。性能更高。优点:epoll相比于poll在于每次扫描只扫描活跃连接数。节省了开销。
以上是关于python IO模式(多路复用和异步IO深入理解)的主要内容,如果未能解决你的问题,请参考以下文章
深入理解 python3.4 中 Asyncio 库与 Node.js 的异步 IO 机制
{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO