nodejs 事件驱动

nodejs一个最大的特点就是支持事件驱动(并发)

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

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,也让开发者可以快速容易的编写高可扩展性服务器。

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

时间: 2024-08-25 08:27:04

nodejs 事件驱动的相关文章

NodeJs开发目录

九篇初识NodeJs NodeJs搭建环境HelloWorld:NodeJs(0) NodeJs初识模块开发:NodeJs(1) NodeJs简单理解package包:NodeJs(2) NodeJs之npm:NodeJs(3) NodeJs两个简单调试技巧:NodeJs(4) NodeJs之global,process:NodeJs(5) NodeJs实用工具util:NodeJs(6) NodeJs事件驱动:NodeJs(7) NodeJs之Http模块:NodeJs(8)

nodejs真的是单线程吗?

[原文] 一.多线程与单线程 像java.python这个可以具有多线程的语言.多线程同步模式是这样的,将cpu分成几个线程,每个线程同步运行. 而node.js采用单线程异步非阻塞模式,也就是说每一个计算独占cpu,遇到I/O请求不阻塞后面的计算,当I/O完成后,以事件的方式通知,继续执行计算2. 事件驱动.异步.单线程.非阻塞I/O,这是我们听得最多的关于nodejs的介绍.看到上面的关键字,可能我们会好奇: 为什么在浏览器中运行的 Javascript 能与操作系统进行如此底层的交互?no

NodeJS中的异步I/O、事件驱动

nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在JS引擎中负责解释和执行JavaScript代码的线程只有一个,即主线程.但实际上还存在其他的线程.例如处理AJAX请求的线程.处理DOM事件的线程.定时器线程.读写文件的线程等.这些线程可能存在与JS引擎之内,也可能存在与JS引擎之外,这些线程为工作线程. 同步和异步 同步:执行任务时,后面的任务

nodejs所用的概念(同步,异步,事件驱动,事件循环等)通俗解释

1.回调:异步编程基本方法之一,当需要执行异步程序时候 ,一般采用后续传递,后续函数写入参数,逐层嵌套,使程序按期望方式走完流程2.异步: 每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的.异步的. js实现异步的方法:回调函数.事件监听.发布/订阅.Promises对象 ,有兴趣可以去阮一峰http://www.ruanyifeng.com/blog/

Nodejs开发指南-笔记

第三章 异步式I/O与事件编程3.1 npm install -g supervisor supervisor app.js 当后台修改代码后,服务器自动重启,生效修改的代码,不用手动停止/启动3.2 单线程异步I/O 减少了多线程的开销,对于操作系统,创建线程的开销很大,需分配内存.列入调度.同时线程切换时 需要内存换页,CPU的缓存被清空,切换回来时,需要重新从内存中读取信息,破坏了数据的局部性. 异步读取文件: var fs = require('fs') fs.readFile('tes

Node.js(一)——NodeJs基础

一.概念 node.js采用Google Chrome浏览器规范引擎 由C++语言编写的.本质上是一个JavaScript的运行环境 nodejs 不仅仅能解析js代码而且没有浏览器端各种安全的级别限制 还提供一些系统级别的API,比如: 1.文件的读写 2.进程的管理 3.网络的通信 09年面世以来一直很火 其次它很强,借助于NodeJs所能完成的事情,当然不仅仅与此 Node-Webkit appjs 相似的应用:允许开发者使用web技术,也就是html/css/js来开发跨平台的.桌面的应

京东前端:PhantomJS 和NodeJS在网站前端监控平台的最佳实践

1. 为什么需要一个前端监控系统 通常在一个大型的 Web 项目中有很多监控系统,比如后端的服务 API 监控,接口存活.调用.延迟等监控,这些一般都用来监控后台接口数据层面的信息.而且对于大型网站系统来说,从后端服务到前台展示会有很多层:内网 VIP.CDN 等. 但是这些监控并不能准确地反应用户看到的前端页面状态,比如:页面第三方系统数据调用失败,模块加载异常,数据不正确,空白开天窗等. 相关厂商内容 Native动态化最新技术解析 不可错过的智能时代的大前端 性能优化最佳实践经验谈 百度技

《NodeJS开发指南》学习笔记

欢迎大家指导与讨论 : ) 注:此笔记是基于<NodeJS开发指南>,并不是原著. 第一章——NodeJS简介 NodeJS是一个可以让Javascript运行在服务器端的平台,它为实时Web应用(Real-time Web)开发而生.拥有实时响应,超大规模数据要求下架构的可扩展性.它采用了单线程.异步式I/O.事件驱动式的程序设计模型.统意义上,Javscript是由ECMA.DOM.BOM组成. NodeJS采用的是单线程模型,对于所有的I/O都采用异步式的请求方式,避免了频繁的上下文切换

Nodejs&#183;进程

之前对这部分的内容很感兴趣,没想到读起来有点晦涩,还是因为对服务器的知识不是很了解. 说道服务器一般人都会想到tomcat或者Jboss或者weblogic,现在流行起来的Node总让人不太放心,JS代码也能做服务器?其实不然,首先一个误区就是Node的服务器是JS写出来的....其实它只有表面暴露给用户使用的模块是用js写的,底层的很多东西还是由C/C++完成的.如果运行在不同的操作系统上,node还会基于操作系统切换底层的实现方式. 再说说Nodejs的特性——最让人印象深刻的就是单线程事件