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深入理解)的更多相关文章
- 并发式IO的解决方案:多路非阻塞式IO、多路复用、异步IO
在Linux应用编程中的并发式IO的三种解决方案是: (1) 多路非阻塞式IO (2) 多路复用 (3) 异步IO 以下代码将以操作鼠标和键盘为实例来演示. 1. 多路非阻塞式IO 多路非阻塞式IO访 ...
- python学记笔记 2 异步IO
在IO编程中,我们知道CPU的速度远远快于磁盘,网络IO,在一个线程中,CPU执行速度的代码非常快,然而遇到IO操作就需要阻塞 需要等待IO操作完成才能继续下一步的动作.这种情况叫做同步IO 在IO操 ...
- 深入理解非阻塞同步IO和非阻塞异步IO
这两篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/historyasamirror/article/details/5778378 http://blog.csdn ...
- python 学习笔记12(事件驱动、IO多路复用、异步IO)
阻塞IO和非阻塞IO.同步IO和异步IO的区别 讨论背景:Linux环境下的network IO. 1.先决条件(几个重要概念) 1.1.用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32 ...
- Python 10 协程,异步IO,Paramiko
本节内容 Gevent协程 异步IO Paramiko 携程 协程,又称为微线程,纤程(coroutine).是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文 ...
- Python之协程、异步IO、redis缓存、rabbitMQ队列
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...
- Python 第七篇:异步IO\数据库\队列\缓存
Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Tws ...
- Python并发编程之初识异步IO框架:asyncio 上篇(九)
大家好,并发编程 进入第九篇. 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 -- asyncio. asyncio是Python 3.4版本引入的标准库,直接内置了对 ...
- python的协程和异步io【select|poll|epoll】
协程又叫做微线程,协程是一种用户态的轻量级的线程,操作系统根本就不知道协程的存在,完全由用户来控制,协程拥有自己的的寄存器的上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来后, ...
随机推荐
- 使用JSONP彻底解决Ajax跨域访问Cookie Session的方案
最近做开发时要把图片文件放到另外一台服务器上(另外一个域名),因为这样分布式存放,网站打开速度会快很多.而我采用AJAX获取图片服务器上某用户的图片时遇到了问题,按照通常的方式无法获取信息,得到的Co ...
- Django中请求的生命周期 和 FBV模式和CBV模式
Django的生命周期就是你的 一个请求所发生的整个流程 Django的生命周期内到底发生了什么呢?? . 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏 ...
- 关于CATransform3D矩阵变换的简单解析
关于CATransform3D矩阵变换的简单解析 效果图: 我能能够用上的CATransform3D其实很简单,并不复杂. CATransform3D有着4种东西我们可以设置. 1. 透视效果(由m3 ...
- Java获取中文拼音、中文首字母缩写和中文首字母
获取中文拼音(如:广东省 -->guangdongsheng) /** * 得到中文全拼 * @param src 需要转化的中文字符串 * @return */ public static S ...
- perceptron感知机 mtalab
data=load('data.txt'); x=[data(:,1),data(:,2)]; y=data(:,3); k=length(y); %绘制散点图 for j=1:k if y(j)== ...
- plsql连接12cR2 PDB报错ORA-28040/ORA-01017
http://hbxztc.blog.51cto.com/1587495/1907533 PS: 在数据库服务器上的oracle/network/admin/sqlnet.ora文件添加一行SQLNE ...
- java重载
public class overLaod { public static void main(String[] args) { // TODO Auto-generated method stub ...
- java String 常用方法集合
String a = "abc";String b = "abc";a==b ;//返回true,因为a,b指向的是同一个地址 String a = new S ...
- SQL的别名和SQL的执行顺序和SQL优化
SQL的别名 1.不可以在where子句中使用列名的别名,即select name t from emp where t>2999;是不允许的 2.使用别名的好处: 提高SQL的易读性 提高SQ ...
- D3——Updates, Transitions, and Motion
<script type="text/javascript"> ; ; ; , , , , , , , , , ,, , , , , , , , , ]; //crea ...