背景故事

小王住在某城市, 生活并长大. 最近, 小城引进了一个企业, 邮局. 这个邮局可了不得, 只要你花上几角钱, 就可以将一封信送到千里之外的朋友手中. 小王也趁机体验了一把, 得劲.

这天, 小王躺在床上想, 既然这个邮局这么好, 咱何不从中分一杯羹呢? 但是现在人家邮局基本都可以说是垄断了, 咱这刚刚起步又能如何呢? 哎, 有了, 既然他把信都收集起来, 那总归是要送出去的吧, 我就把送信的给包下来. 想到就做到, 第二天, 小王就去邮局谈这个事情, 经过一番协商, 将送往京津冀的信件包了下来.

远古版本

包下来之后, 简单注册了一下, 小公司正式成立了. 先招个人来, 毕竟咱也是老板了. 招聘信息发出后, 第二天新员工小张就到了. 正式开工了.

王总: 小张, 去邮局把北京的信件拿回来
小张: 好嘞
没多大一会, 小张回来了, 还带回来了一堆信件
王总: 嗯, 不错. 再去把天津的信件拿回来吧.
这次, 一直等到第五天, 小张回来了, 同时也把信件带回来了.
王总: 小张, 怎么这么慢啊? 奖金还想不想要了?
小张: 没办法啊, 王总. 邮局那边的人说了, 没有信件, 就不让我回来.
王总: 但是已经有用户投诉了, 送往河北的信已经发出好几天了, 还没送到, 咱们想个解决办法吧.
小张: 王总, 既然这样, 那就只能在招人了, 一个人负责取一个地方的信件, 这样才能保证信件到了之后可以立马拿回来啊.
王总: 行吧, 这也是没有办法的办法了.
于是, 又招来了两个员工, 每个员工负责一个地区的信件, 不停的去邮局取信.

这就是最古老的版本了, 多线程阻塞式读取. 很显然, 耗费大量人力.

初次升级

就这样过了两个月, 小王的业务是越做越大, 在原来京津冀的基础上, 又承包了内蒙地区. 所以, 需要为内蒙地区再招一个人进来. 王总是越想越不对劲, 那岂不是以后再扩展业务, 都要频繁的招人嘛? 不行, 我得找邮局聊聊. 于是, 王总找到了邮局局长.

王总: 局长, 听说我的人去邮局拿信, 没有信就不让人走? 这是什么道理?
局长: 什么? 还有这种事情, 王总莫急, 我回去问问.
王总: 那真是辛苦局长了.

这局长办事, 效率就是不一样, 第二天消息回来了. 以后邮局不许把收信的人扣下. 小王心中的小算盘得逞了. 你想啊, 原本需要4个人干的活, 现在一个人就干了. 只要不停的去邮局取信就行了. 小张跟自己的时间最长, 王总考虑之后, 还是决定把小张留下.

王总: 小张啊, 看你最近表现不错, 我决定工资给你翻一倍.
小张: 谢谢王总. 听说最近邮局出了新政策, 我每次取信的时候, 貌似都没有人留我了.
王总: 嗯, 没错. 经过我与邮局领导讨论, 决定废除之前留人的规定. 所以我决定公司取信的员工只留你一个人.
这下可把小张坑惨了, 他需要不停的取邮局取信, 不管有没有, 都要回来汇报一下, 然后继续去取下一个地方的信件.
但是公司现在只需要一个人就可以了, 嗯, 省钱.

这就是在之前基础上, 稍加改进之后的: 非阻塞式轮训读取.

再次升级

最然公司现在只需要一个人了, 但是小张这每天跑来跑去的给累够呛. 现在是4个地方的信件, 全部拿回来, 小张就需要往邮局跑4趟, 本来一趟就能拿回来, 这不多此一举么? 费时费力的. 想到这, 小张发现了这个规则需要改进的地方, 但是他又不知道如何跟邮局高层反应, 只好告诉王总. 王总一听, 嗯, 有道理. 如果可以这样的话, 那拿信件的速度不就更快了么, 用户体验上更上一层楼啊, 得赶快落实下来.

王总: 局长啊, 我觉得现在的规定有些可以改进的地方.
局长: 嗯? 我觉得挺好啊, 有什么问题你说说看.
王总: 现在我们的人去取信, 每次只能取一个地方的信, 但是我承包了4个城市, 能不能取信的时候可以一次性把4个城市的信件都给我啊.
局长: 嗯, 你的建议很好, 不过我还要开会讨论一下.
王总悄悄的留下一个红包, 走了.
没过几天, 邮局传来消息, 王总之前提的已经下发了最新命令. 允许取信人批量获取.

从此, 从邮局取信更快捷了.

这就是select版本. 可以一次性批量向系统提出查询, 然后批量返回.

又升级

就这样又安稳的过了五个月, 随着业务的不断长大, 王总已经接下了全国40多个地区的信件. 但是随着地区的增加, 小张去取信的速度也变慢了, 王总心里不得劲了, 这个小张变的懒惰了, 回头要好好说说他.

王总: 小张啊, 公司慢慢壮大了, 怎么你取信的速度变得慢了不少, 倒也没见你信件多拿回来啊.
小张: 王总, 你是不知道. 每次我去取信, 都要邮局的人一个城市一个城市的找, 之前只有4个城市, 找的自然快. 现在几十个城市, 自然就变慢了.
王总: 嗯, 这倒是个问题, 那有没有什么好的想法呢?
小张: 王总, 其实我已经想过了. 现在我去拿信, 不光他们找的慢, 还可能找到最后一封信件都没有. 之前我一天可能要往邮局跑几百趟, 很多其实都没有拿到信件.
当时我就想, 如果每次等有信件了, 我再去拿, 那我就可以少跑几次了. 所以, 如果邮局那边有新的信件, 打电话告诉我一下, 然后我去拿回来就完美了.
王总: 嗯, 也好, 之前总让你跑, 确实不是个办法.
经过与邮局的一番协商, 这个新的方案再度落实了. 这次小张倒落得清闲, 有信件的时候就去拿, 没有的时候喝喝茶等着就是了.

从此, 王总的公司日渐壮大, 小张也平步青云.

这就是epoll版本, 将需要的数据绑定, 交由系统管理, 新消息是由系统通知.


以上是将一篇历史文章简单故事化, 查看历史文章: redis的多路复用是什么鬼

IO多路复用小故事的更多相关文章

  1. Python:通过一个小案例深入理解IO多路复用

    通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import time start = time.time() ...

  2. IO多路复用之select总结

    1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/ ...

  3. python中的IO多路复用

    在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...

  4. 【知乎网】Linux IO 多路复用 是什么意思?

    提问一: Linux IO多路复用有 epoll, poll, select,知道epoll性能比其他几者要好.也在网上查了一下这几者的区别,表示没有弄明白. IO多路复用是什么意思,在实际的应用中是 ...

  5. 聊聊IO多路复用之select、poll、epoll详解

    本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538922&idx=1&sn=e6b436ef ...

  6. python之IO多路复用

    在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...

  7. IO多路复用的几种实现机制的分析

    http://blog.csdn.net/zhang_shuai_2011/article/details/7675797 select,poll,epoll都是IO多路复用的机制.所谓I/O多路复用 ...

  8. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例

    除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #incl ...

  9. IO多路复用之select

    IO多路复用之select总结   1.基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交 ...

随机推荐

  1. Building Applications with Force.com and VisualForce(Dev401)(十四):Implementing Business Processes:Auditing Processes

    Dev401-015:Implementing Business Processes:Auditing Processes Module Objectives1.list some of the fe ...

  2. 【Pytest02】全网最全最新的Pytest框架快速进阶篇(pytest前置和后置以及忽略测试用例)

    一.Pytest的前置和后置方法 1.Pytest可以集成unittest实现前置和后置 import unittest import pytest class TestCase(unittest.T ...

  3. 基于vue-cli-和element-ui的开发admin(1)

    //首先以下仅是记录个人本次vue后台管理系统的登录界面部分操作的流程以及踩坑的注意点 一.首先是搭建vue-cli工作环境 这里有两种方式:1.用npm:(在安装了vue,vue-cli以及webp ...

  4. Git 命令实战入门 ,奶妈级教程

    我不会用*官方*的语言告诉你Git 是什么,对此我表示深深得歉意--在我看来像CSDN.博客园.掘金等博客交流平台就是小的“GitHub”,只不过在这里更多的是一些零零散散的笔记或者文章,其实Gihu ...

  5. 移动端rem布局实现(vw)

    什么是rem?在W3C官网上是这样描述的:“font size of the root element (根元素的字体大小)”.就是说rem是相当于html的,因为网页的默认字体大小是 16px,所以 ...

  6. JS 剑指Offer(一) 数组中的重复数字

    题目:在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 分析: ...

  7. 大数据篇:Hive

    大数据篇:Hive hive.apache.org Hive是什么? Hive是Facebook开源的用于解决海量结构化日志的数据统计,是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射 ...

  8. ES6规范及语法基础

    var的特点 函数作用域 let的特点 没有变量提升,必须先声明.再调用 同一个作用域下不可以重复定义同一个名称 块级作用域 function fun(){ let a = 10 if(true){ ...

  9. IDEA+EasyCode实现代码生成

    IDEA+EasyCode实现代码生成 Easy Code介绍 EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml).只要是与数据 ...

  10. (C#、JavaScript)面向对象的程序设计

    面向对象(OOP)的理解 喜欢程序的朋友们,大家应该都听过一句话"万物皆对象",感觉老牛X了. 面向对象的程序设计,它是围绕真实世界来设计程序的. 面向对象三要素:封装.继承.多态 ...