第一个例子是关于医生看病。

在美国去看医生,需要填写大量表格,比如保险、个人信息之类,传统的基于线程的系统(thread-based system),接待员叫到你,你需要在前台填写完成这些表格,你站着填单,而接待员坐着看你填单。你让接待员没办法接待下一个客户,除非完成你的业务

想让这个系统能运行的快一些,只有多加几个接待员,人力成本需要增加不少。

基于事件的系统(event-based system)中,当你到窗口发现需要填写一些额外的表格而不仅仅是挂个号,接待员把表格和笔给你,告诉你可以找个座位填写,填完了以后再回去找他。你回去坐着填表,而接待员开始接待下一个客户。你没有阻塞接待员的服务

你填完表格,返回队伍中,等接待员接待完现在的客户,你把表格递给他。如果有什么问题或者需要填写额外的表格,他给你一份新的,然后重复这个过程。

这个系统已经非常高效了,几乎大部分医生都是这么做的。如果等待的人太多,可以加入额外的接待员进行服务,但是肯定要比基于线程模式的少得多。

第二个例子是快餐店点餐。

在基于线程的方式中(thread-based way)你到了柜台前,把你的点餐单给收银员或者给收银员直接点餐,然后等在那直到你要的食物准备好给你。收银员不能接待下一个人,除非你拿到食物离开。想接待更多的客户,容易!加更多的收银员!

当然,我们知道快餐店其实不是这样工作的。他们其实就是基于事件驱动方式,这样收银员更高效。只要你把点餐单给收银员,某个人已经开始准备你的食物,而同时收银员在进行收款,当你付完钱,你就站在一边而收银员已经开始接待下一个客户。在一些餐馆,甚至会给你一个号码,如果你的食物准备好了,就呼叫你的号码让你去柜台取。关键的一点是,你没有阻塞下一个客户的订餐请求。你订餐的食物做好的事件会导致某个人做某个动作(某个服务员喊你的订单号码,你听到你的号码被喊到去取食物),在编程领域,我们称这个为回调(callback function)。

Node.Js做了什么工作呢?

传统的web server多为基于线程模型。你启动Apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了IO操作(这也被称之为阻塞式IO).想提高这样的web server的性能就只有启动更多的server实例。

相反的,Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

考虑下面这个过程:

1,你用浏览器访问nodejs服务器上的"/about.html"

2,nodejs服务器接收到你的请求,调用一个函数从磁盘上读取这个文件。

3,这段时间,nodejs webserver在服务后续的web请求。

4,当文件读取完毕,有一个回调函数被插入到nodejs的服务队列中。

5,nodejs webserver运行这个函数,实际上就是渲染(render)了about.html页面返回给你的浏览器。

好像就节省了几微秒时间,但是这很重要!特别是对于需要相应大量用户的web server。

Dan York原文:Node.js, Doctor’s Offices and Fast Food Restaurants – Understanding Event-driven Programming

转载于:https://www.cnblogs.com/cdwp8/p/4170180.html

从医生看病和快餐店点餐理解Node.js的事件驱动相关推荐

  1. 理解node.js(Understanding node.js)

    因为最近自己在学习node.js,刚开始学.看到这篇文章挺有意思,介绍了一下node.js有助于理解基于事件驱动的回调,就翻译了一下. 英文原文: Understanding node.js 理解no ...

  2. 深入理解 Node.js 中的 Worker 线程

    多年以来,Node.js 都不是实现高 CPU 密集型应用的最佳选择,这主要就是因为 JavaScript 的单线程.作为对此问题的解决方案,Node.js v10.5.0 通过 worker_thr ...

  3. 理解Node.js(译文)

    前言 总括 :这篇文章十分生动形象的的介绍了Node,满足了读者想去了解Node的需求.作者是Node的第一批贡献者之一,德国前端大神.译者觉得作者的比喻很适合初学者理解Node,特此翻译. 译者 : ...

  4. linux进程退出所有tcp数据才发送,深入理解Node.js 进程与线程(8000长文彻底搞懂)...

    前言 进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少.本篇文章除了介绍概念,通过Node.js 的角度讲解进 ...

  5. [译]理解Node.js事件驱动机制

    学习 Node.js 一定要理解的内容之一,文中主要涉及到了 EventEmitter 的使用和一些异步情况的处理,比较偏基础,值得一读. 大多数 Node.js 对象都依赖了 EventEmitte ...

  6. [译]理解 Node.js 事件驱动架构

    原文地址:Understanding Node.js Event-Driven Architecture 大部分 Node 模块,例如 http 和 stream,都是基于EventEmitter模块 ...

  7. 理解node.js中的 Event Loop

    node中的 "event loop" 正是node能处理高并发的核心所在.也正是因为它,node虽然在本质上是个单线程,却能让大量的操作处于后台运行.这篇文章将详细说明 even ...

  8. 理解Node.js的异步非阻塞I/O模型

    对后台服务器编程不清楚,通过在网上查资料也就大概有写了解. Apache对并发请求的处理方式是,对每个请求就创建一个线程处理,这个线程是堵塞的.因为线程的是占用内存的,所以一台服务器能支持的并发线程量 ...

  9. ajax 高并发请求,理解node.js处理高并发请求原理

    很少分享技术文章,写的不好的地方请大家多多指教,本文是自己对于node.js的一些见解,如有纰漏请在评论区交流. 高并发策略 通常高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程 ...

  10. 理解Node.js的event loop

    为什么80%的码农都做不了架构师?>>>    关于Node.js的第一个基本概念是I/O操作开销是巨大的: 所以,当前变成技术中最大的浪费来自于等待I/O操作的完成.有几种方法可以 ...

最新文章

  1. LeetCode简单题之图像渲染
  2. flask_sqlalchemy 多对多重复插入解决办法
  3. 电信运营商的云机遇-【软件和信息服务】2015.01
  4. 可以插卡的ipad_ipad哪个可以插手机卡上网的?
  5. 3*3 c语言,C语言实现小游戏(三) 3*3棋盘游戏
  6. python爬取股票实时价格_【美股量化00篇】Python获取新浪接口美股实时数据
  7. oracle主备库查询,oracle11g dataguard 备库数据同步的检查方法
  8. 【吉比特】G-bits2017技术类岗位编程题
  9. .net core精彩实例分享 -- 反射与Composition
  10. 推荐算法之用户推荐(UserCF)和物品推荐(ItemCF)对比
  11. JQuery选择器中含有冒号的ID处理差异的分析
  12. Mysql一些重要配置参数的学习与整理(二)
  13. wchar_t转为char*
  14. 防骗指南-套路贷以及肉偿
  15. RS422接线 z-tek RS232 TO RS485/RS422
  16. 变电所、分区所、AT所
  17. 手动引入jar包,解决Dependency ‘XXX‘ not found的两种方式
  18. android接入支付宝自动续费,APP是如何实现自动续费的?
  19. win 32学习笔记(三) 消息队列
  20. Unity优化翻译官方文档(六) ------ CPU Usage Profiler

热门文章

  1. Nginx 内存池源码阅读
  2. linux开发之uboot移植 -- uboot简介
  3. 以太网交换机工作原理
  4. linux 磁盘检测卡主_在Windows和Linux中找出磁盘分区使用的文件系统,就是这么简单...
  5. window下git的用户切换_Windows下Git的使用
  6. 使用freemarker模板生成html文件(一)
  7. MyBatis之使用XML配置SQL映射(二)CRUD映射配置
  8. 【渝粤教育】国家开放大学2018年春季 7392-21DMatlab语言及其应用 参考试题
  9. [渝粤教育] 重庆电子工程职业学院 信息技术与人工智能基础 参考 资料
  10. ACM 学习笔记(四) 数据结构之树、二叉树、完全二叉树、二叉查找树、AVL树、红黑树、B树、B+树