首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

[转] 纵谈NodeJS

2012-07-27 
[转] 漫谈NodeJS作者:zhangxin来源:http://blog.csdn.net/zhangxin09/article/details/5836777?学习NodeJS

[转] 漫谈NodeJS

作者:zhangxin

来源:http://blog.csdn.net/zhangxin09/article/details/5836777

?

学习NodeJS第一天:node.js引言

?

?

Node.JS是资深C程序员Ryan Dahl(http://four.livejournal.com/)的作品,依据Google著名的开源JavaScript引擎V8来进行二次开发的Web I/O服务器(http://nodejs.org/)。V8本身是非常快的JavaScript引擎,处理JS执行运行的速度非常高。相关测试表明,FireFox、Opera和IE的JS引擎速度都不及V8来得快。而且,还可以说,只要浏览器之间的JS引擎大战一日不减,NodeJs就可以从中受益。有竞争才有进步:)。

[转] 纵谈NodeJS

[转] 纵谈NodeJS

NodeJS基本用法也是十分简单明了的,我们看看一下这一句,就是最简单的代码:

NodeJS?有一定性能优势,却引发了我们技术人员的浓厚兴趣。不免要问,NodeJS?是如何办到的?NodeJS?是开源项目,如果不打算直接通过源码了解,我们还是可以通过网上一点资讯了解。笔者收集了关于NodeJS?的几遍文章、博客,略有心得,将它们想表达NodeJS?的特点、缺点、相关原理、前期分析、选型等等各方的问题“共冶一炉”,说出个NodeJS?初步分析的大概。

如果各位看官不太了解服务端的运作的话,我们稍微回顾一下请求Request这一环节的过程。现今多数的Web?服务器中,有一条新的链接就会申请一条线程来负责处理至到这个Request?周期结束,接着执行其他流程。可以想象,成千上万个链接便有成千上万条线程(Thread-spawning?)。每条线程姑且以堆栈2MB?的消耗去计算,一条条线程它们的累加都是不小的数目。如何优化和改进本身就是一个大问题,此外,使用系统线程,必须考虑线程锁的问题,否则造成堵塞主进程又是一个令人操心的难题。NodeJS?则通过基于事件的异步模型绕开了基于线程模型的所带来的问题。NodeJS?使用JavaScript?单线程(Single-threaded?)轮询事件,设计上比较简单,高并发时,不仅根本性的减少了线程创建和切换的开销(因而没有吓人的消耗),而且由于没有锁,也不会造成进程阻塞。每当有链接发起到服务端之后,NodeJS?会透过epoll?、?kqueue?、/dev/poll?或?select?指令通知操作系统,有新链接到达,应执行指定的回调函数(Callback?)。每个链接从成本上说只消耗一个堆(heap allocation?)。

不是有WebSocket?标准吗?HTML5?的世界尽管在移动平台上很热闹,普通浏览器升级却觉得是另一回事。如果现在一下子都是支持WebSocket?的浏览器,那不用说准是皆大欢喜了,但事实和将来的预测表明Web Socket?完全是另外一回事,咱和咱用户面对的仍旧那些僵硬不化的IE6……?所以说在WebSocket?不现实的今天,将善于“长链接”的Nodejs?派上用场便有很充分的理由。

p.s?:……包括用flash socket?组件那些hack?的都不算。

事件循环的console模拟图

实际上,NodeJs?不是第一家标榜事件的Web Server?,早在NodeJs?之前,在各种语言中都有事件的实现,不能不提的就是nginx?。不过使用JavaScript?还属于头一遭吧。过去几年可以说是JS?引擎发展的高峰期,就连最保守的微软也要IE9?把落后的JS?解释速度争回来,亲爱的服务端方面却又怎么按耐的住呢?自然,革新速度后,JS VM?引入到Server side?的工作便是一个顺理成章的事。

话说回来基于事件理念的Server?。Node.js?最初得益于Ruby?的Event Machine?和Python?的Twisted?,将包括各种I/O操作定义在回调函数中,通过事件不断轮询任务列表来触发那些Callback?,——并且NodeJS?有创新的地方,就是提出新的思路来呈现事件机制。从原理上讲,Node.js?不仅仅是一个库,而是尝试利用语言机制来构建的事件模型。Event Machine?或Twisted?不是这样,它们都是在代码开始和结束的时候插入回调函数来完成一个阻塞的调用,然后这个过程的启用,就用:

?

?

结语

最后一点,谈谈node.js?为什么选择Google V8?的JS?引擎而不是另一个著名的SpiderMonkey?引擎。抛开速度等的硬性指标不表,可能是SpiderMonkey?源码仍然比较复杂的缘故,不好把玩,人们自然就青睐于虽然是C++?的V8了。

本文介绍了一位JS?爱好者对NodeJS?以及后台初步感性的了解,没有深刻的认识,竟也成文,看官们可作取舍(trade-off?),将就来读,并请积极献言,一同讨论。

?

参考:

Werner Schuster?,http://www.infoq.com/news/2009/11/nodejs-evented-io

Louis Simoneau?,Node.js is the New Black

UDP & Dgram UNIX daemon Socket supporthttp://groups.google.com/group/nodejs/browse_thread/thread/665422a1dc28d874

Paul Querna, Drinking the Node.js Kool-Aid

热点排行
Bad Request.