阿里云飞天发布时刻,领先大模型限免,超7000万 tokens免费体验 了解详情
写点什么

Node.js V0.12 新特性之在单进程中跑多个实例

  • 2014-04-01
  • 本文字数:1962 字

    阅读完需:约 6 分钟

实例

经常有人提出,希望 Node.js 能被嵌入到其他程序中,特别是让它能跟其他事件循环整合而且(与此同时)支持多个 Node 执行情境:也就是说让多个 Node 实例在同一个进程中和平共处的能力。想象一下,比如有个 node-webkit 程序,每个窗口都运行在自己的 Node 实例上,各窗口彼此相互独立。或者把 Node 嵌在手机或网络交换机里,处理多连接的路由逻辑,但却只是在单个进程中,并且不久的将来就能实现。

一个客户找到我们,说他们的程序需要这类功能。他们经过调研,肯定了我们在 Node 核心和 libuv 上的贡献和专业能力,决定请我们帮忙。这是个相当有挑战性的订单,因为Node 一开始就是- 并且现在仍然是- 一个单线程的程序,围绕着单一事件循环的概念构建,用上百个全局变量存放各种状态。

你可以想象一下,在这样的代码库上加装线程安全是多么容易出错的任务,所以那不是我们要做的- 或者说我们还没那么做。我们希望这个修改对客户来说经济实惠,并且向前迈出这一步也能帮到整个社区。顺便说一下,如果你发现自己需要对Node 做些修改,可自己又没时间研究该怎么改,我们可以帮忙!

引入多情境

实际上,我们在Node v0.12 中实现了在同一个事件循环中使用多个执行情境的能力。别担心:对普通用户来说并没有显性的变化,一切都和以前一样。但如果你是嵌入开发人员,或本地附加组件作者,请继续往下看!

提交 756b622 中的“多情境”工作是第一次,也是最重要的清理任务:它把所有全局变量审了一遍,首先去掉了那些不需要放在全局中的变量,并将剩下的变成了执行情境的属性。虽然那还不足以保证线程安全,但这第一步很重要。

第二步是让 Node 内部意识到多执行情境的存在。C++ 运行时在任何地方进入 V8 VM,都要先确保它进入的是正确的情境。下面是一个简单的例子:

复制代码
function onconnect() {
this.write('GET / HTTP/1.1\r\n' +
'Host: strongloop.com\r\n' +
'\r\n');
this.pipe(process.stdout);
}
require('net').connect(80, 'strongloop.com', onconnect);

Execution-wise,差不多应该是这个样子的:

复制代码
<enter VM>
connect(80, 'strongloop.com'); // kernel reports EINPROGRESS here
<leave VM>
<wait for TCP handshake to complete>
<enter VM>
onconnect();
<leave vm>

在进入 VM 的调用之间可能会改变执行情境。因此 connect() 有必要记住当前情境,并且调用 onconnect() 能恢复它。如果做不到这一点,追踪 bug 将会变得极其困难。

好在 Node 可以自动把这个处理好;嵌入开发人员和本地附加组件作者不需要担心这个,除非他们想用 v8::Function::Call() 代替 node::MakeCallback() 进入 VM 做调用。

如果你是本地附加组件作者,想让你的附件组件具备识别情境的能力,你需要:

复制代码
* Instead of NODE_MODULE(), use
NODE_MODULE_CONTEXT_AWARE(). Before:
void Initialize(v8::Handle<v8::Object> exports) {
// ...
}
NODE_MODULE(foo, Initialize)

之后:

复制代码
void Initialize(v8::Handle<v8::Object> exports,
v8::Handle<v8::Value> module,
v8::Handle<v8::Context> context) {
// ...
}
NODE_MODULE_CONTEXT_AWARE(foo, Initialize);

能识别情境的初始化方法在嵌入创建的每个情境都会被调用一次。现在还没有各情境的清理函数,最终会由 node::AtExit() 承担这一职责,但目前还是一个针对进程的事件。如果对你来说这样不行,请在这里提交个bug。

将全局变量变成各情境的属性有几种办法,其中一个是为你自己宣称一个嵌入数据索引,并把所有东西都存在那里。

这些索引还没有全局注册表,所以仍有发生冲突的可能。有没有想试着给打个补丁?同时挑一个差不多大的随机数(比如2^10 到2^16 之间的),但不要太极端:V8 用一个非稀疏矩阵作为嵌入索引的内部存储。将索引宣称为1 << 29 就会消耗很多内存!

还有多少工作要做?

这里还有些粗糙的边界需要打磨:process.chdir() 会改变所有情境的工作目录,但实际上应该只改变调用它的情境的工作目录;从多情境中加载附加组件还有些边界情况,等等诸如此类的地方。但那属于修修补补力求尽善尽美的工作了。基本框架已经到位了,并且那家赞助我们开发多情境特性的公司已经成功地用上它了。更重要的是,它为多线程多重租赁铺平了道路。那在Node v0.12 之前不太可能发生了,但我们可能会在Node v1.0 或另一个版本中见到它- 只要我们敢!

作者简介

本文最初由 Ben Noordhuis 发表在 StrongLoop 上。Ben Noordhuis 从 2010 年就跟着 Ryan Dahl 开发 Node.js 的核心代码。他一直在为改进 Node 核心代码而努力做着编码、调试和基准测试等工作。作为最高产的 Node 核心开发者之一,Ben 编写了 Node.js 和 libuv 中的很多代码。 StrongLoop 降低了在 Node 中开发APIs 的难度,还添加了监测、集群化以及私有注册的支持等DevOps 能力。

查看英文原文: What’s New in Node.js v0.12 – Running Multiple Instances in a Single Process

2014-04-01 22:564547
用户头像

发布了 45 篇内容, 共 26.3 次阅读, 收获喜欢 11 次。

关注

评论

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

鸿蒙版小红书如何让图库访问完全由“你”掌控

HarmonyOS SDK

harmoyos

CST设置多层背景材料详细教程

思茂信息

cst电磁仿真 CST软件 CST Studio Suite

从识别到推理:人工智能能否实现自主思维?

天津汇柏科技有限公司

人工智能

ClickHouse 的“独孤九剑”:极速查询的终极秘籍

京东科技开发者

AI 辅助编程:人机协作驱动的开发效率革命与技术路径选择

代码制造者

#AI编程

制定国际标准!腾讯云 EdgeOne 产品能力入选 3GPP 核心技术规范

极客天地

通过API接口实现1688图片搜索商品功能全攻略

Noah

监控指标太多,VictoriaMetrics 如何自保?

巴辉特

Victoriametrics

给Ai-Agent重塑真身 ---浅谈如何优雅地拆解AI-Agent

京东科技开发者

动态化-罗码(京东科技一码多端解决方案)介绍

京东科技开发者

Frontier AI Moneyball发布新一代人才数据

财见

数据驱动金融韧性升级,开启数据交换“新范式”:构建“实时、国产化强适配”的数据交换与共享平台

tapdata

数据交换 数据共享 数据集成工具 实时数据交换 实时数据共享

Tata Communications获评领导者

财见

利用 AWS Signature:REST API 认证的安全指南

数据追梦人

AI数字人开发的技术难点

北京木奇移动技术有限公司

AI技术开发 软件外包公司 AI数字人

亚马逊 API 系列:商品列表接口接入与应用

tbapi

亚马逊API 亚马逊商品数据采集 亚马逊商品列表接口

基于 DeepSeek GRPO 的 1.5B Rust 代码生成模型训练实战

Baihai IDP

AI rust LLMs DeepSeek GRPO

AI面试官来了!成都招聘会用AI筛简历,你敢试试吗?

王中阳Go

Go AI 面试

AI数字人的主要功能

北京木奇移动技术有限公司

AI技术 软件外包公司 AI数字人

AI数字人的应用领域

北京木奇移动技术有限公司

软件外包公司 AI技术应用 AI数字人

浙江大学与阿里云宣布合作人工智能通识课,通义灵码系列课程率先落地

阿里巴巴云原生

阿里云 云原生

浙江大学与阿里云宣布合作人工智能通识课,通义灵码系列课程率先落地

阿里云云效

阿里云 云原生

通义灵码 - HTML智能编码辅助AI工具

阿里巴巴云原生

人工智能 云计算 测试

首批首家!DataCanvas Alaya NeW智算操作系统顺利通过中国信通院“大模型推理平台”标准评估

新消费日报

从效率到创新:iVX 驱动的大型企业研发体系升级路径

代码制造者

低代码 无代码

践行低碳行动!北京地铁签约用友

用友智能财务

财务 会计

深度学习的下一个突破:从图像识别到情境理解

天津汇柏科技有限公司

人工智能 深度学习

新质美力· 迸发向上 | 花西子+赛博威产品创新平台蓝图完美落地!

赛博威科技

数字营销 赛博威 花西子 产品创新平台

OpenAI全面支持MCP协议:AI生态重构与行业变革的起点

测试人

人工智能

IngressNightmare:Ingress Nginx 再曝5个安全漏洞,可接管你的 K8s 集群

阿里巴巴云原生

阿里云 云原生 Higress

如何优雅实现电商API的统一调用:订单与物流接口整合实战

代码忍者

API 接口

Node.js V0.12新特性之在单进程中跑多个实例_架构/框架_Ben Noordhuis_InfoQ精选文章