Python的Socket知识5:IO多路复用

IO 多路复用是5种I/O模型中的一种。

1、同步vs异步,阻塞vs非阻塞

  • 同步vs异步:

    • 同步:相互牵制,两者之间有一定的约束   

    • 异步:两者之间无关,互不牵制

  • 阻塞vs非阻塞

    • 阻塞:发出一个请求,如果条件不满足,会一直等待直到条件满足

    • 非阻塞:发出一个请求,如果条件不满足,则直接返回一个标志信息,而不会一直等待下去。

  • 并发vs并行

    • 并发数是指同时进行的任务数(如同时服务的 HTTP 请求).

    • 并行数是可以同时工作的物理资源数量(如 CPU 核数)

    • 比如去某部门办事需要依次去几个窗口,办事大厅里的人数就是并发数,而窗口个数就是并行度。

2、5种 I/O模型介绍

2-1 阻塞IO:

  • 解释:直到等待数据准备就绪,内核将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。

  • 优点:能够及时返回数据,无延迟;对内核开发者来说这是省事了;

  • 缺点:对用户来说处于等待就要付出性能的代价了;

  • 案例:我和朋友点完餐后,朋友本想还和我一起逛街的,但是不知道饭能什么时候做好,只好和我一起在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。

2-2 非阻塞IO:

  • 解释:需要用户线程不断的轮询检查内核数据是否准备好,直到数据准备好,再拷贝数据到进程,进行数据处理其不会交出 CPU,而会一直占用 CPU

  • 优点:能够在等待任务完成的时间里干其他活了(包括提交其他任务,也就是 “后台” 可以有多个任务在同时执行)。

  • 缺点:任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。

  • 案例:我朋友点完餐后,不甘心白白在这等,又想去逛商场,又担心饭好了,所以逛一会,回来询问服务员饭好了没有,来来回回好多次。需要不断的询问。

  • 案例2:老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。耗费:往返车站6次,路上6小时,其他时间做了好多事。

2-3 多路复用IO模型:

  • IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。对于监视的方式,又可以分为 select(限制检视数量), poll, epoll三种方式。

  • 案例:假设你现在去女生宿舍楼找自己的女神, 但是你只知道女神的手机号,并不知道女神的具体房间。IO多录复用就是找一个宿管大妈来帮你监视下楼的女生, 这个期间你可以些其他的事情. 例如可以顺便看看其他妹子,玩玩王者荣耀, 上个厕所等等.  IO复用又包括 select, poll, epoll 模式. 那么它们的区别是什么?

    •  select大妈    每一个女生下楼, select大妈都不知道这个是不是你的女神, 她需要一个一个询问, 并且select大妈能力还有限, 最多一次帮你监视1024个妹子

    • poll大妈不限制盯着女生的数量,  只要是经过宿舍楼门口的女生, 都会帮你去问是不是你女神

    • epoll大妈不限制盯着女生的数量, 并且也不需要一个一个去问.  那么如何做呢?  epoll大妈会为每个进宿舍楼的女生脸上贴上一个大字条,上面写上女生自己的名字,  只要女生下楼了, epoll大妈就知道这个是不是你女神了, 然后大妈再通知你

2-4 信号驱动模型:

  • 当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。

2-5 异步IO模型Proactorr模式:

  • 用户线程发起 IO 请求后,立刻去做其他事情。内核会等待数据准备完成,然后将数据拷贝到用户线程,当这两个阶段完成后,内核会给用户线程发送一个信号,表示操作已完成。所以用户线程只需要发起一个请求,而不用知道IO操作是如何进行的

可参考网址:

https://www.zhihu.com/question/32163005

http://www.cnblogs.com/Anker/p/3254269.html

用故事讲述区别:

故事情节为:老李去买火车票,三天后买到一张退票。参演人员(老李,黄牛,售票员,快递员),往返车站耗费1小时。

1.阻塞I/O模型

老李去火车站买票,排队三天买到一张退票。

耗费:在车站吃喝拉撒睡 3天,其他事一件没干。

2.非阻塞I/O模型

老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。

耗费:往返车站6次,路上6小时,其他时间做了好多事。

3.I/O复用模型

1.select/poll

老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次

2.epoll

老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,黄牛手续费100元,无需打电话

4.信号驱动I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,免黄牛费100元,无需打电话

5.异步I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。

耗费:往返车站1次,路上1小时,免黄牛费100元,无需打电话

1同2的区别是:自己轮询

2同3的区别是:委托黄牛

3同4的区别是:电话代替黄牛

4同5的区别是:电话通知是自取还是送票上门

3、案例实现IO多录复用:

1)socket sever案例。

  

2、写两个程序一样的client客户端。

第一个客户端程序:

第二个客户端程序:

执行结果:每个客户端连上服务器后,发送两个消息。

服务器端

客户端1:


客户端2:

链接:https://pan.baidu.com/s/1ggcavIF 密码:b4le

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值