写点什么

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

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

关注

评论

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

内含(基础+进阶+高级+调优)的神仙级的阿里巴巴“MySQL”教程限时开源!

Java 架构 面试 程序人生 编程语言

大模型时代的AI之变与开发之根

脑极体

GraphQL 快速入门【4】GraphQL 组件

码语者

Rest graphql

列举出常见的Java面试题100+,我靠这个在十月拿到了阿里的offer

Java 程序员 编程语言

VSCode 中,TS 提示 ”无法找到 *.vue 声明文件“ 的解决方案

编程三昧

vscode Vue3 ts 9月日更

想要入职阿里P8?至少是要啃完这本500页Java并发多线程源码笔记!

Java 架构 面试 程序人生 编程语言

太有用,Alibaba架构师十年心血熬成的435网络协议文档

程序员 编程语言 网络协议 TCP/IP

在线黑客帝国文字效果生成工具

入门小站

工具

基于虹软SDK,适配Camera1、Camera2、CameraX,实现人脸识别(Android)

小驰笔记

android 音视频 人脸识别 引航计划

[外文资源]最好的 Golang 博客

baiyutang

golang 9月日更

13个VSCode使用技巧,开启高效的开发模式

华为云开发者联盟

vscode 日志 开发 插件 Git存储库

DCEP:真正的“无现金新时代”!现已完成技术对接!

CECBC

顺丰对供应链+区块链应用的思考与规划

CECBC

linux之登录式shell和非登录式shell

入门小站

Linux

阿里云天池赛题解析——深度学习篇重磅发布!

博文视点Broadview

网站攻击到提权的全部过程

网络安全学海

黑客 网络安全 信息安全 WEB安全 漏洞分析

P8整理的OpenStack构架,希望能帮助到你

hanaper

分布式系统都要遵守的CAP

卢卡多多

CAP 9月日更

详解html5新增的标签与css3中伪类和伪元素

你好bk

html5 css3 大前端 基础技能

2022前端react高频面试题

buchila11

React

java 虚拟机 GC :G1配置参数

风翱

GC 9月日更

膜拜!不愧是阿里大牛总结的Java10W字面经,Github访问量已破百万

Java 程序员 架构 面试 计算机

Prometheus 2.30.0 新特性

耳东@Erdong

release Prometheus 9月日更

小程序下一破局点?钉钉小程序卡片,应用与平台的深度集成

阿里巴巴终端技术

小程序 ios android App 移动开发

秋招如何抱佛脚?2021最新大厂Java面试真题合集(附权威答案)

Java 架构 面试 程序人生 编程语言

网络攻防学习笔记 Day150

穿过生命散发芬芳

9月日更 网络流量分析

「绝密档案」“爆料”完整秒杀架构的设计到技术关键点的“情报信息”

洛神灬殇

后端 秒杀系统 秒杀架构 秒杀架构设计 引航计划

深入浅出Redis宝典,阿里架构师10年经验汇总,PDF免费分享

Java redis 架构

2021年最新整理, C++ 学习资料,含C++ 11 / 14 / 17 / 20 / 23 新特性、入门教程、推荐书籍、优质文章、学习笔记、教学视频等

奔着腾讯去

c++

android逆向之root方式注入apk

轻口味

android 9月日更

被客户像小学生一样训话

boshi

创业

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