最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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

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

关注

评论

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

时间轮原理及其在框架中的应用

vivo互联网技术

服务器 时间轮

ModStartCMS模块化建站系统 v3.6.0 内容标签增强,电脑手机适配

ModStart开源

大数据培训Hive 提高查询效率的方法

@零度

hive 大数据开发

阿里代码依赖漏洞检测服务,高效杜绝代码安全隐患

阿里云云效

云计算 阿里云 云原生 代码安全 依赖漏洞检测

常见的反爬措施:UA反爬和Cookie反爬

华为云开发者联盟

Python 爬虫 Python爬虫 反爬虫 Cookie反爬虫

AliSSR 语音超分算法:让在线会议语音更明亮更自然

阿里云视频云

阿里云 音视频 智能降噪 音频3A 音频算法

最佳代码扫描工具,实现自动化代码扫描服务

阿里云云效

云计算 阿里云 开发 代码扫描 代码安全

【前端架构必备】手摸手带你搭建一个属于自己的脚手架

战场小包

前端 脚手架 3月月更

《LeetCode刷题报告》题解内容Ⅰ

謓泽

3月月更

洞见科技参编的中国信通院《联邦学习场景应用研究报告》正式发布

洞见科技

联邦学习 隐私计算 中国信通院 洞见科技

教你识别一些sequence的相关问题

华为云开发者联盟

序列 GaussDB(DWS) sequence GTM bind关系

适合 Kubernetes 初学者的一些实战练习(二)

Jerry Wang

Kubernetes 云原生 Kubernetes 集群 Serverless Kubernetes 3月月更

Java中的序列化安全漏洞梳理

陈德伟

Java 安全 编程语言、 序列化机制

java培训JVM面试题分享

@零度

JVM JAVA开发

企业和团队如何创建高效实用的知识管理体系

小炮

知识管理 企业

AppCube低代码快速开发健康打卡应用

DS小龙哥

3月月更

实时渲染大赛结果将于3月31日晚8点B站直播公布,敬请期待!

3DCAT实时渲染

实时渲染 3D动画

一文了解MySQL的Buffer Pool

华为云开发者联盟

MySQL 缓存 缓冲池 Buffer Pool 脏页

【高并发】解密导致并发问题的第二个幕后黑手——原子性问题

冰河

并发编程 多线程 协程 异步编程 精通高并发系列

重视软件开发的黑匣子

菜根老谭

bug 系统安全 程序日志

DDoS攻击与防范策略

喀拉峻

网络安全 信息安全 DDoS

适合 Kubernetes 初学者的一些实战练习(一)

Jerry Wang

云原生 #Kubernetes# Kubernetes 集群 Serverless Kubernetes 3月月更

哈尔滨市消防救援支队:用宜搭打造消防智慧大脑,守护冰城平安

一只大光圈

低代码 数字化 消防 钉钉宜搭

什么是分支模式 ? 各(类)分支正确的使用方式

阿里云云效

云计算 阿里云 云原生 Feature 分支模式

电商系统微服务拆分

Geek_8d5fe5

「架构实战营」

面试突击34:如何使用线程池执行定时任务?

王磊

java面试

go 1.18 bufio 包中的 Writer.AvailableBuffer

黑客不够黑

go 1.18 Writer.AvailableBuffer

web前端培训使用 Vue3来实现文章目录功能

@零度

Vue 前端开发

RocketMQ 开源爱好者请注意邀您共探行业应用与生产实践

阿里巴巴云原生

ABAP 简易弹出输出/输入框

Jasen Ye

Input abap decide CONFIRM

表数据都删了一半,可我的表文件咋还是那么大

华为云开发者联盟

MySQL 文件 innodb 数据页

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