多路复用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相关推荐

  1. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...

  2. 5种网络IO模型:阻塞IO、非阻塞IO、异步IO、多路复用IO、信号驱动IO

    目录 前言 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) 模型间的区别 ...

  3. IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

    文章目录 IO模型 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用IO五类. 最主要的两 ...

  4. Reactor模型和Proactor模型:同步IO与异步IO

    Table of Contents 服务端的线程模型 2种fd 3种事件 Reactor模型-同步I/O 1.单Reactor单线程模型 2.单Reactor多线程模型 3.主从Reactor多线程模 ...

  5. 程序员成长之旅——同步IO和异步IO(五种IO模型)

    程序员成长之旅--同步IO和异步IO(五种IO模型) 同步和异步 同步 异步 消息通知 场景比喻 阻塞和非阻塞 阻塞 非阻塞 事例 同步IO 阻塞IO 非阻塞IO 信号驱动IO 多路转接IO 异步IO ...

  6. 同步IO(阻塞IO、非阻塞IO), 异步IO的理解

    什么是IO? 在计算机中无时无刻不存在着对数据的访问和读取(数据都存储在物理的媒介上,例如寄存器,高速缓存,内存,磁盘,网卡等等),这些操作被称为IO. 阻塞IO 当用户线程发起IO请求后,会进行系统 ...

  7. 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?

    通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...

  8. 【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO

    IO分两阶段: 1.数据准备阶段:在该阶段,根据是否等待数据准备,将IO分成阻塞和非阻塞: 2.内核空间复制回用户进程缓冲区阶段:在该阶段,只要程序需要等待复制完成,才能往下运行(尽管这个时间很短), ...

  9. 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

    5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...

  10. 重叠IO模型-异步IO

    重叠IO模型-异步IO http://laiba.tianya.cn/laiba/CommMsgs?cmm=959&tid=2701316824681802728 说到重叠模型首先还是提一下异 ...

最新文章

  1. linux下Tomcat+OpenSSL配置单向双向认证(自制证书)
  2. 【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】
  3. 【学习笔记】springboot的AutoConfigurationImportSelector 、@EnableAutoConfiguraion和@import解析
  4. 参数MEMORY_MAX_TARGET 和MEMORY_TARGET 的修改
  5. javascript-内置对象-date对象-JSON对象-Math对象
  6. Linux技术网站中文,Linux技术网站,putty工具,中文显示设置
  7. 美国国防部设立承包商网络漏洞披露计划
  8. android studio svn 忽略文件
  9. Tedddby Activator V5.1,免费绕过iOS 14.7Beta,支持iCloud登录
  10. BMP图像位图法隐藏信息
  11. 最棒的10款MySQL GUI工具
  12. fastreport 横向打印多列
  13. ImageMagick简介、GraphicsMagick、命令行使用示例
  14. PIN PUK1
  15. 电子商务应围绕网商、网货、网规三要素 - 卫哲
  16. Eclipse中,代码没错,但有红叉叉
  17. 软件测试工程职场发展细谈
  18. matlab中kmeans聚类算法
  19. 霍夫变换论文、代码汇总
  20. Dos脚本调用打印机用户界面及配置

热门文章

  1. php赋值 jq,使用js和jQuery如何实现指定赋值方法
  2. 2018安徽省计算机一级试题答案,2018年计算机等一级考试试题100题及参考答案.docx...
  3. LATEX学习篇【二】:论文中的公式技巧QA
  4. C++函数概念解析(1)
  5. 吉林省2021高考成绩排名查询,2021年吉林高考成绩排名查询系统,吉林高考位次排名表...
  6. php faker 中文,使用faker 生成中文测试数据
  7. 【数据挖掘导论】——数据质量
  8. NO1:在Windows端安装SecureCRT来连接Linux
  9. Java中使用log4j记录日志
  10. java自动化_作为测试工程师进阶自动化选Java还是Python?