NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:345334
用户头像

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

关注

评论

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

SaaS 的多版本销售该如何设计

产品海豚湾

产品经理 产品设计 SaaS B端产品 9月月更

【字符串函数内功修炼】strcpy + strcat + strcmp(一)

Albert Edison

C语言 9月月更 strcpy strcat strcmp

【云原生 | 从零开始学Docker】八丶Docker网络与部署redis集群

泡泡

Docker 云原生 9月月更

2022-09-18:以下go语言代码输出什么?A:1;B:15;C:panic index out of range;D:doesn’t compile。 package main import

福大大架构师每日一题

golang 福大大 选择题

AOP实现系统告警

Java aop spring aop 告警系统

主流开源消息队列对比与分析

穿过生命散发芬芳

消息中间件 9月月更

大数据调度平台Airflow(二):Airflow架构及原理

Lansonli

airflow 9月月更

爆火小游戏《羊了个羊》,我偏不玩

图灵教育

游戏开发 游戏设计 游戏史

面试突击84:Spring 有几种事务隔离级别?

王磊

Java 面试

22个常用的js单行代码

大师兄

JavaScript 前端面试 9月月更

本地部署 VS 云服务

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

Java进阶(二十六)公司项目开发知识点回顾

No Silver Bullet

Java 9月月更

Java中的Request和Response详解

共饮一杯无

Request 9月月更 Response 请求与响应

【云原生 | 从零开始学Docker】九丶完结篇 Docker Compose

泡泡

容器 云原生 Docker 镜像 9月月更

性能测试知识科普(一):核心术语

老张

性能测试

最被夸大的6项技术

雨果

新技术

又创新作!阿里SpringBoot高阶手册爆火,简直不要太香!

收到请回复

Java 云计算 开源 架构 编程语言

户外服装品牌TheNorthFace遭遇撞库 撞库究竟如何成功窃取账户信息

郑州埃文科技

撞库 拖库 洗库

String,StringBuilder,StringBuffer区别,竟有这么多不同

知识浅谈

string string buffer 9月月更

Flomesh Ingress 的 SSL 透传

Flomesh

数据科学公司Anaconda最新调研报告:40%因安全顾虑将减少开源软件使用

雨果

数据科学 开源软件

终于大橘已定,分享一波测开面经(美团、小米、华为、阿里等)

Java-fenn

Java 程序员 java面试 Java学习 Java面试题

三分钟了解什么是时序数据库

阿泽🧸

时序数据库 9月月更

精通高并发与内核 | Linux内核与C/Java进程与线程深度解析

小明Java问道之路

并发编程 线程 进程 Linux内核 9月月更

案例拆解:重要节日客情维护的礼品卡券应用

boshi

运营 礼品

FeatureStore meetup V4回顾|腾讯 & 微软 & 第四范式特征平台技术解析与应用实践

星策开源社区

机器学习 微软 特征平台 MLOps FeatureStore

2022 IDC中国未来企业大奖颁布,华为云数据库助力德邦快递获奖

华为云开发者联盟

数据库 后端 华为云 物流 企业号九月金秋榜

精通高并发与内核 | Linux内核进程的切换方式

小明Java问道之路

进程 Linux内核 进程管理 9月月更 进程切换

Elasticsearch聚合学习之五:排序结果不准的问题分析

程序员欣宸

elasticsearch 9月月更

项目进度delay怎么办

Ian哥

项目管理 项目进度 项目计划

[极致用户体验] 为什么建议2022年不用"等比设计稿"+rem,而用"灵活设计稿"+px

HullQin

CSS JavaScript html 前端 9月月更

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