2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

二叉树常见oj题(持续更新中)

雪芙花

c c++ 10月月更

如何实现车联网的灵活数据采集

EMQ映云科技

车联网 物联网 IoT 数据采集 10月月更

Python多任务实现方式(一)-----多进程

木偶

Python 进程 10月月更

java中HashMap的设计精妙在哪?

华为云开发者联盟

Java 开发 华为云 企业号十月 PK 榜

用户故事地图怎么用?实践才能出真知

敏捷开发

敏捷 敏捷开发 用户故事 用户故事地图

华为云数据库稳定可靠-即开即用

与时俱进的时代

华为

研发效能度量不要“你觉得”,而要这样的度量指标体系!

博文视点Broadview

论文解读丨CIKM'22 MARINA:An MLP-Attention Model for Multivariate Time-Series Analysis

华为云开发者联盟

数据库 后端 华为云 企业号十月 PK 榜

一文看懂Vue2和Vue3中设置404界面

木偶

Vue 前端 10月月更

实现企业转型,华为云大数据实力领先

IT科技苏辞

安全、可靠、合规,华为云守护企业网站安全

IT科技苏辞

云服务的智能堪称颠覆,华为云带来多种守护

IT科技苏辞

C++从入门到精通(第八篇) :IO流

雪芙花

c c++ 10月月更

navicat 绿化版

源字节1号

软件开发 前端开发 后端开发 小程序开发

聊聊机器如何“写“好广告文案?

百度Geek说

AIGC 企业号十月 PK 榜 广告创意

软件测试面试真题 | 测试流程大概是什么?

测试人

面试 软件测试 测试开发

华为云数据库-RDS for MySQL数据库

与时俱进的时代

华为云

“科技与狠活”梗爆火,食品安全焦虑问题怎么破?

旺链科技

区块链 产业区块链 食品安全 企业号十月PK榜

IPv4 用完,如今花钱才能重新使用获取?

郑州埃文科技

IP

华为云大数据,共建智能世界的数据底座

IT科技苏辞

为什么软件供应链攻击愈演愈烈?

SEAL安全

开源 开源软件 软件供应链安全 软件攻击

华为云文档数据库服务更安全

与时俱进的时代

华为

零代码,让业务人员实现应用创造自由

华为云开发者联盟

云计算 后端 低代码 华为云 企业号十月 PK 榜

广告内容定向分级,保护未成年人身心健康

HarmonyOS SDK

广告sdk

OSPF基础(一):OSPF工作原理以及优点、OSPF的缺点、OSPF配置方法、DR与BDR的选举原理

Python-派大星

10月月更

从React源码分析看useEffect

goClient1992

React

React源码分析8-状态更新的优先级机制

goClient1992

React

C#中关于接口(Interface)的详解(附带案例)

木偶

C# 接口 10月月更

C++从入门到精通(第九篇) :多态

雪芙花

c c++ 10月月更

鸿蒙开发实例 | 为什么选择HarmonyOS?

TiAmo

华为 鸿蒙 10月月更

路由基础:三层交换机、单臂路由的特点以及配置特点、DHCP报文类型、DHCP工作原理、在路由器上配置DHCP、在交换机上配置DHCP、配置DNS服务器

Python-派大星

10月月更

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