理解Node.js事件驱动编程

摘要:
Node.Js是基于javascript语言,建构在googleV8engine以及Linux上的一个非阻塞事件驱动IO框架。nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的性能非常高,而且想达到多核或者多进程也不是很难。这里主要不是介绍nodejs具体应用代码,而是想介绍一下事件驱动编程。相反的,Node.Js使用事件驱动模型,当webserver接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。这也就是为什么Node.Js这么热这么惹人关注。

Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现)。

但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优势?

Node.Js是基于javascript语言,建构在google V8 engine以及Linux上的一个非阻塞事件驱动IO框架。nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的性能非常高,而且想达到多核或者多进程也不是很难(现在已经有大量的第三方module来实现这个功能)。

这里主要不是介绍nodejs具体应用代码,而是想介绍一下事件驱动编程。

在这篇文章(1)里面,Dan York介绍了两种典型的事件驱动实例。

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

在美国去看医生,需要填写大量表格,比如保险、个人信息之类,传统的基于线程的系统(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。

这也就是为什么Node.Js这么热这么惹人关注。而且它还使用了一个非常通用的编程语言Javascript,也让开发者可以快速容易的编写高可扩展性服务器。

转自:http://www.cnblogs.com/lua5/archive/2011/02/01/1948760.html

原文:(1)http://code.danyork.com/2011/01/25/node-js-doctors-offices-and-fast-food-restaurants-understanding-event-driven-programming/

免责声明:文章转载自《理解Node.js事件驱动编程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ONE模拟器基本知识Android Studio更换项目名具体操作步骤(附带修改APP名称,图标)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何修改已有的ONNX模型

简单来说,我们只需要学习一下把大象如何放进冰箱的就行了: 1、把冰箱门打开 使用onnx的原生接口: onnx_model = onnx.load(onnx_path) graph = onnx_model.graph 这样我们就可以将模型load出来,并且到到graph信息。 2、把大象放进去 这一步相对来说选择就比较多了,比如你可以选择删除一些节点,...

ElasticSearch性能优化策略【转】

ElasticSearch性能优化主要分为4个方面的优化。 一、服务器部署 二、服务器配置 三、数据结构优化 四、运行期优化 一、服务器部署 1、增加1-2台服务器,用于负载均衡节点 elasticSearch的配置文件中有2个参数:node.master和node.data。这两个参 数搭配使用时,能够帮助提供服务器性能。 1.1> node.ma...

图形数据库 Neo4j 开发实战

本人用途:知识图谱 neo4j:图状数据库 官网地址:http://neo4j.com/docs/java-reference/current/ 中文API:https://www.w3cschool.cn/neo4j/neo4j_building_blocks.html Neo4j 简介 数据存储一般是应用开发中不可或缺的组成部分。应用运行中产生的...

npm run dev时 一堆报错 (node:37693) Warning: Accessing nonexistent property 'chmod' of module exports inside circular dependency

(node:37693) Warning: Accessing non-existent property 'cat' of module exports inside circular dependency(Use `node --trace-warnings ...` to show where the warning was created)(nod...

java操作xm——添加、修改、删除、遍历

package com.xml.zh; import javax.xml.parsers.*; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.Tr...

XML知识总结

1、XML概念及作用? XML( eXtensible Markup Language,可扩展标记语言)是一种简单的数据存储语言 作用:用来存储和交换数据 无法描述页面的排版和显示形式 2、XML和XHTML的区别  1、XHTML 2、XML 标签  (1)标签都有固定含义 不能去创造新的标签          (2)支持自定义标签,具有扩展性 作用 ...