Node.js基于Google V8提供了基于事件的I/O处理
2012-03-09 17:17
736 查看
Node.js基于Google V8提供了基于事件的I/O处理
作者 Werner Schuster 译者 马国耀 发布于 2009年11月26日领域 架构 & 设计, 语言 & 开发 主题 Ruby , JavaScript , 运行时 , 动态语言 , Java , 语言 , 架构 , 编程 , 性能和可伸缩性分享到
Node.js使得可伸缩的独立Javascript服务端程序可以使用基于事件的I/O,如EventMachine或Python的Twisted,Grand Central Dispatch的分发源和队列(queues)以及很多类似的系统。
这篇演讲讨论了Node.js背后的实现及设计理念(PDF链接)。主要说来,Node.js让你可以写这样的代码(来自链接中的胶片):
http.createServer( function (req,res) { res.sendHeader(200, {"Content-Type": "text/plain"}); res.sendBody("Hello\r\n"); res.sendBody("World\r\n"); res.finish(); }).listen(8000);这里的createServer方法对系统进行设置,让其监听8000端口;连接到来时触发并调用所传入的匿名函数。无需手动建立线程或者分发进来的请求,这些是由Node.js负责的。
这仅仅是一个例子,还有很多其他的I/O操作(包括读和写)也可以通过回调和事件的方式进行处理。 并且还可能实现stdein的无阻塞读。
在 Node.js的API中,事件的概念被到处使用。通过addListener方法的简单使用,就可在不同的系统中注册各类事件。如,全局process对象就可以通过以下代码(摘自演讲胶片)实现对操作系统信号的监听:
process.addListener("SIGINT", function () { puts("good bye"); process.exit(0) } );其他库返回Promise对象,它可以发出以下事件中的一种:“成功”,“失败”,“取消”。 下面的例子来自Node.js API文档。
var posix = require("posix"), sys = require("sys"); var promise = posix.unlink ("/tmp/hello"); promise.addCallback(function () { sys.puts("successfully deleted /tmp/hello"); });promise.addCallback方法注册了一个监听器,在本例中当API调用成功完成时,Promise对象发出“成功”事件,该监听器被调用。也可以通过Promise上的等待(wait)或超时 (timeout)请求实现类似功能,这样,Promise对象一直等待,直到超时信号的引发。
通过Promise的概念,Node.js能够在执行阻塞调用时,实际上并不需要阻塞Javascript代码执行。这些调用由一个后台线程执行,当它结束时,发出Promise事件。
为了实现这些设计目标,Node.js使用了Google V8并打包了其中的一些库:
libev 实现了时间循环并封装了底 层使用的具体的技术(如select, epoll等)。 libeio 使用了一个线程池来在后台执行阻塞调用。udns在这里起了作用,它帮助实现了非阻塞的DNS解析库(DNS解析在操作系统中通常只能以阻塞调用的形式提供) 。
如 http-parser等协议实现
目前,基于Node.js已经创建了一些库,如对数据库的绑定,类似于BERT-RPC的协议以及其他等等。
在设计中还考虑了对 HTML 5 Web Workers API的支持;Web Workers允许Javascript启动一个执行任务的worker。不同于内存共享的线程,Web Workers的worker互不可见(也看不到其创建者);交互只能通过消息传递的方式进行,这使得它们非常类似于Erlang进程。
Node.js附带了一个可执行文件以及一个shell(REPL),可执行文件用于执行Javascript 文件,shell脚本易于测试Javascript编码。
欲了解更多信息,请参考Simon Willison编写的关于Node.js的文章;该文章提供了一些使用Node.js库的例子,比如,如何访问Redis及如何创建Web项目等。
Node.js使得对Javascript的使用更像一个GUI脚本语言,然而它的确继承了Javascript的一个问题,即缺乏标准Javascript库。Node.js带来了一些库,并提到使用第三方库一定会有所帮助,但是它仍然不太接近Java或Ruby的标准库。随着Javascript用于开发客户端应用的越 发流行,完全有可能出现通用的,不基于浏览器的库。
你会考虑使用Node.js吗?用的话,用来做什么呢?
查看英文原文:Evented I/O for Javascript with Google V8-based Node.js
译者 马国耀 关注企业级应用相关的开发、架构及思想的发展。尤其对Java EE、SOA、ESB和Cloud Computing等领域持有浓厚兴趣。
相关厂商内容
将Node.js用于数据密集型实时应用(DIRT)相关文章推荐
- Google 的V8 JS引擎和Node.JS
- node.js中的事件处理机制及事件环机制
- Node.js的事件处理
- 创业笔记-Node.js入门之基于事件驱动的回调
- KoaHub.JS基于Node.js开发的处理和显示日期代码
- Node.js 用回调处理一次性事件
- 详解Node.js API系列C/C++ Addons(2) Google V8引擎
- 理解Node.js的事件循环(代码是异步单线程,内部实现用的还是进程和线程,基于池化的线程实现异步)
- JS脚本可视化调试支持——基于Google v8引擎的脚本调试
- Node.js 用回调处理一次性事件
- node.js中的事件处理机制详解
- 《Node.js》之事件处理机制以及事件环机制(一)
- 《Node.js》之事件处理机制以及事件环机制(二)
- 福音!JS脚本可视化调试支持——基于Google v8引擎的脚本调试
- node.js 使用-事件处理(EventEmitter)
- Dnode:基于Node.js给浏览器提供异步远程方法调用
- Dnode:基于Node.js给浏览器提供异步远程方法调用
- Node.js中处理异步编程(使用回调处理一次性事件,使用事件监听器处理重复性事件)
- node.js 基于事件驱动的回调
- nodejs mongoose 数据库处理