多路复用IO和异步IO
多路复用I/O
它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
流程图如下:
当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。
强调
1. 如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。
2. 在多路复用模型中,对于每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户的process其实是一直被block的。只不过process是被select这个函数block,而不是被socket IO给block。
结论: select的优势在于可以处理多个连接,不适用于单个连接
1 from socket import *
2 import time
3 import select
4
5
6 server = socket(AF_INET, SOCK_STREAM)
7 server.bind(('127.0.0.1',8080))
8 server.listen(5)
9 server.setblocking(False)
10
11 data_dic={}
12 read_list=[server,]
13 write_list=[]
14 print('start....')
15 while True:
16 # 括号里面应该有四个参数,最后一个参数timeout默认的话就是一直在这边等待,直到接收到参数。
17 # 如果设置超时延时,那么如果在3s未接受到数据,他会自动运行下面的代码。但是如果他在1s就接收到数据,
18 # 就会直接执行下面程序。
19 rl,wl,xl=select.select(read_list,write_list,[]) #read_list=[server,conn1,conn2,conn3,conn4]
20 # print('read_list:%s rl:%s wl:%s ' %(len(read_list),len(rl),len(wl))) #rl=[conn1,conn2]
21 for sk in rl:
22 if sk == server:
23 conn,addr=sk.accept()
24 read_list.append(conn)
25 else:
26 # sk.recv(1024)
27 # print(sk)
28 data=sk.recv(1024)
29 write_list.append(sk)
30 data_dic[sk]=data
31
32 for sk in wl:
33 sk.send(data_dic[sk].upper())
34 data_dic.pop(sk)
35 write_list.remove(sk)
服务端
1 from socket import *
2 import os
3
4 client=socket(AF_INET,SOCK_STREAM)
5 client.connect(('127.0.0.1',8080))
6
7 while True:
8 msg='%s say hello' %os.getpid()
9 client.send(msg.encode('utf-8'))
10 data=client.recv(1024)
11 print(data.decode('utf-8'))
客户端
异步IO
用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。流程图如下:
上节课复习: 1、协程 什么是? 协程指的是单线程下由应用程序级别实现的并发 即把本来由操作系统控制的切换 保存状态,在应用 程序里实现了
协程的切换vs操作系统的切换 优点: 切换速度远快于操作系统 缺点: 一个任务阻塞了,其余的任务都无法执行
ps:只有遇到io才切换到其他任务的协程才能提升 单线程的执行效率
为何用? 把单个线程的io降到最低,最大限度地提升单个线程的执行效率
如何实现? from gevent import spawn,monkey;monkey.patch_all()
2、io模型 block io nonblocking io 1、对cpu的无效占用率过高 2、不能即时反馈客户端的信息
更多专业前端知识,请上 【猿2048】www.mk2048.com
多路复用IO和异步IO相关推荐
- Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...
- 5种网络IO模型:阻塞IO、非阻塞IO、异步IO、多路复用IO、信号驱动IO
目录 前言 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) 模型间的区别 ...
- IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
文章目录 IO模型 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用IO五类. 最主要的两 ...
- Reactor模型和Proactor模型:同步IO与异步IO
Table of Contents 服务端的线程模型 2种fd 3种事件 Reactor模型-同步I/O 1.单Reactor单线程模型 2.单Reactor多线程模型 3.主从Reactor多线程模 ...
- 程序员成长之旅——同步IO和异步IO(五种IO模型)
程序员成长之旅--同步IO和异步IO(五种IO模型) 同步和异步 同步 异步 消息通知 场景比喻 阻塞和非阻塞 阻塞 非阻塞 事例 同步IO 阻塞IO 非阻塞IO 信号驱动IO 多路转接IO 异步IO ...
- 同步IO(阻塞IO、非阻塞IO), 异步IO的理解
什么是IO? 在计算机中无时无刻不存在着对数据的访问和读取(数据都存储在物理的媒介上,例如寄存器,高速缓存,内存,磁盘,网卡等等),这些操作被称为IO. 阻塞IO 当用户线程发起IO请求后,会进行系统 ...
- 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?
通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...
- 【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO
IO分两阶段: 1.数据准备阶段:在该阶段,根据是否等待数据准备,将IO分成阻塞和非阻塞: 2.内核空间复制回用户进程缓冲区阶段:在该阶段,只要程序需要等待复制完成,才能往下运行(尽管这个时间很短), ...
- 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...
- 重叠IO模型-异步IO
重叠IO模型-异步IO http://laiba.tianya.cn/laiba/CommMsgs?cmm=959&tid=2701316824681802728 说到重叠模型首先还是提一下异 ...
最新文章
- linux下Tomcat+OpenSSL配置单向双向认证(自制证书)
- 【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】
- 【学习笔记】springboot的AutoConfigurationImportSelector 、@EnableAutoConfiguraion和@import解析
- 参数MEMORY_MAX_TARGET 和MEMORY_TARGET 的修改
- javascript-内置对象-date对象-JSON对象-Math对象
- Linux技术网站中文,Linux技术网站,putty工具,中文显示设置
- 美国国防部设立承包商网络漏洞披露计划
- android studio svn 忽略文件
- Tedddby Activator V5.1,免费绕过iOS 14.7Beta,支持iCloud登录
- BMP图像位图法隐藏信息
- 最棒的10款MySQL GUI工具
- fastreport 横向打印多列
- ImageMagick简介、GraphicsMagick、命令行使用示例
- PIN PUK1
- 电子商务应围绕网商、网货、网规三要素 - 卫哲
- Eclipse中,代码没错,但有红叉叉
- 软件测试工程职场发展细谈
- matlab中kmeans聚类算法
- 霍夫变换论文、代码汇总
- Dos脚本调用打印机用户界面及配置
热门文章
- php赋值 jq,使用js和jQuery如何实现指定赋值方法
- 2018安徽省计算机一级试题答案,2018年计算机等一级考试试题100题及参考答案.docx...
- LATEX学习篇【二】:论文中的公式技巧QA
- C++函数概念解析(1)
- 吉林省2021高考成绩排名查询,2021年吉林高考成绩排名查询系统,吉林高考位次排名表...
- php faker 中文,使用faker 生成中文测试数据
- 【数据挖掘导论】——数据质量
- NO1:在Windows端安装SecureCRT来连接Linux
- Java中使用log4j记录日志
- java自动化_作为测试工程师进阶自动化选Java还是Python?