写点什么

Node.js 基于 Google V8 提供了基于事件的 I/O 处理

  • 2009-11-26
  • 本文字数:1619 字

    阅读完需:约 5 分钟

Node.js 使得可伸缩的独立 Javascript 服务端程序可以使用基于事件的 I/O,如 EventMachine 或 Python 的 Twisted ,Grand Central Dispatch 的分发源和队列(queues)以及很多类似的系统。

这篇演讲讨论了Node.js 背后的实现及设计理念(PDF 链接)。主要说来,Node.js 让你可以写这样的代码(来自链接中的胶片):

复制代码
http.createServer( function (req,res) {<br></br> res.sendHeader(200, {"Content-Type":
"text/plain"});<br></br> res.sendBody("Hello\r\n");<br></br> res.sendBody("World\r\n");<br></br> res.finish();
<br></br> }).listen(8000);<br></br>

这里的 createServer 方法对系统进行设置,让其监听 8000 端口;连接到来时触发并调用所传入的匿名函数。无需手动建立线程或者分发进来的请求,这些是由 Node.js 负责的。
这仅仅是一个例子,还有很多其他的 I/O 操作(包括读和写)也可以通过回调和事件的方式进行处理。 并且还可能实现 stdein 的无阻塞读。

Node.js 的 API 中,事件的概念被到处使用。通过 addListener 方法的简单使用,就可在不同的系统中注册各类事件。如,全局 process 对象就可以通过以下代码(摘自演讲胶片)实现对操作系统信号的监听:

复制代码
process.addListener("SIGINT",<br></br> function () {<br></br> puts("good bye");<br></br>
process.exit(0)<br></br> }<br></br>);<br></br>

其他库返回 Promise 对象,它可以发出以下事件中的一种:“成功”,“失败”,“取消”。 下面的例子来自 Node.js API 文档。

复制代码
var posix = require("posix"),<br></br> sys = require("sys"); <p>var promise = posix.unlink
("/tmp/hello");</p><br></br>promise.addCallback(function () { <br></br> sys.puts("successfully deleted
{1}
/tmp/hello"); <br></br>});<br></br>

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

2009-11-26 07:345439
用户头像

发布了 184 篇内容, 共 79.3 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

会声会影编辑面板常用功能介绍

懒得勤快

Micro Focus Fortify 最新能力发布,应用安全进入“一切皆代码”新时代

趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突

热爱java的分享家

Java 架构 编程语言 经验分享 哈希表

Alibaba最新神作!耗时182天肝出来1015页分布式全栈手册太香了

热爱java的分享家

Java 面试 分布式 编程语言 经验分享

DAS易用性设计

赫杰辉

论文解读丨无参数的注意力模块SimAm

华为云开发者联盟

卷积神经网络 视觉 注意力模块 SimAm 神经元

彻底搞懂访问者模式的静态、动态和伪动态分派

Tom弹架构

Java 架构 设计模式

分区丢失导致文件丢失?巧用EasyreCovery找回!

淋雨

数据恢复

秋招拿到offer之后,分享面试阿里、头条、腾讯的经过以及一些总结

Geek_1df311

Java 编程 程序员 架构 面试

TypeScript 之 Typeof Type Operator

冴羽

JavaScript typescript html5 翻译 大前端

又一次漏洞复现与分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

CSS布局(四)之文本布局

Augus

CSS 11月日更

优秀!阿里甩出GC面试小册,仅7天Github获赞96.9K

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

pringBoot + Mybatis Plus + ClickHouse增删改查入门教程

程序员万金游

MySQL 数据库 mybatis Clickhouse

帧彩视界之Pseudo HDR:为普通SDR设备用户提供HDR体验

微帧Visionular

视频编码 HDR

外卖跑腿系统专业开发外卖跑腿app源码开发

风行无疆

24 K8S之Service资源及其模型

穿过生命散发芬芳

k8s 11月日更

艾媒报告:百度输入法AI功能领跑行业 用户满意度第一

百度开发者中心

百度 AI

你的web知识有所欠缺。

喀拉峻

Web 安全

多商户入驻系统开发多商户入驻app源码开发

风行无疆

Function Mesh:Serverless 在消息与流数据场景下的火花

Apache Pulsar

大数据 架构 云原生 Apache Pulsar pulsar社区

Go语言学习查缺补漏ing Day6

Regan Yue

Go 语言 11月日更

掌握Java的内存模型,你就是解决并发问题最靓的仔

华为云开发者联盟

Java 内存模型 线程 并发 工作内存

在牛客逮到一个阿里10年老Java开发,聊过之后收益良多...

Geek_1df311

Java 编程 架构 面试 计算机

Pulsar 分级存储 -- S3 演示

Apache Pulsar

大数据 架构 云原生 分布式存储 Apache Pulsar

元气部落盲盒软件原生开发芒趣盲盒app源码

风行无疆

干货必收藏!墨天轮最受DBA欢迎的250份学习文档合集

墨天轮

MySQL 数据库 oracle postgresql

行业分析| 为什么uni-app在音视频领域这么火?

anyRTC开发者

uni-app 音视频 移动开发 语音通话 视频通话

如何修复org/jacoco/agent/rt/internal_773e439/Offline异常?

Changing Lin

11月日更

为何每次用完ThreadLocal都要调用remove()?

热爱java的分享家

Java 程序人生 编程语言 经验分享

工具 | 一条 SQL 实现 PostgreSQL 数据找回

RadonDB

数据库 postgresql RadonDB

Node.js基于Google V8提供了基于事件的I/O处理_Ruby_Werner Schuster_InfoQ精选文章