网易首页 > 网易号 > 正文 申请入驻

Node.js 中的多线程和多进程

0
分享至

作者:疯狂的技术宅 来源:前端先锋

Node.js 是一个免费的跨平台 JavaScript 运行时环境,尽管它本质上是单线程的,但是可以在后台使用多个线程来执行异步代码。

由于 Node.js 的非阻塞性质,不同的线程执行不同的回调,这些回调首先委托给事件循环。Node.js 运行时负责处理所有这一切。

为什么要用 NodeJS?

JavaScript 最初是作为一种单线程编程语言构建的,仅在 Web 浏览器中运行。这意味着在一个过程中,只有一组指令能够在给定的时间执行。

仅在当前代码块的执行完成后,才移至下一个代码块。但是,JavaScript 的单线程性质使实现变得容易。

最初 JavaScript 仅用于向网站添加少量交互。所以并没有对多线程的需求。但是时代已经变了,用户要求也越来越高,JavaScript 已成为 Web 上流行的编程语言。

多线程现在变得很普遍。由于 JavaScript 是单线程语言,因此无法在其中实现多线程。幸运的是,在这种情况下,有一个很好的解决方法:Node.js。

Node.js 框架并不少,这要归功于 JavaScript 运行时环境(尤其是 JavaScript)的普遍流行。在继续本文之前,让我们了解一些有关 Node.js 的重要观点:

  • 可以用 send 函数将消息从子进程传递到其他子进程和主进程
  • 支持 fork 多个进程
  • 主进程和子进程之间不共享状态
为什么要 fork 进程?

在两种情况下,我们需要 fork 一个流程:

  • 通过将任务委派给其他进程来提高速度
  • 用于释放内存和卸载单个进程

可以将数据发送到子进程,也可以将其送回。

Node.js 的方式

Node.js 使用两种类型的线程:

  • 通过事件循环处理主线程,
  • 工作池中有许多辅助线程

事件循环负责获取回调或函数,并将其注册以供将来执行。它与正确的 JavaScript 代码在同一线程中运行。一旦 JavaScript 操作阻塞了线程,事件循环也会被阻塞。

工作池是一个执行模型,负责产生和处理不同的线程。它同步执行任务,然后将结果返回到事件循环,最后事件循环将结果提供给回调。

总而言之,工作池负责异步 I/O 操作,即与系统磁盘和网络的交互。像 fs 和 crypto 这样的模块是使用工作池的主要模块。

由于工作池是在 libuv 库中实现的,Node.js 在 JS 和 C++ 之间进行内部通信时会稍有延迟。不过这几乎是不可察觉的。

一切都很好,直到我们遇到同步执行复杂操作的要求。任何需要大量时间执行的函数都会导致主线程阻塞。

如果程序具有多个占用大量 CPU 的函数,将会导致服务器吞吐量的显著下降。在最坏的情况下,服务器将会失去响应,并且无法将任务委派给工作池。

诸如 AI、大数据和机器学习之类的领域无法从 Node.js 中受益,因为这些操作阻塞了主线程,并使服务器失去响应。但是这随着 Node.js v10.5.0 的到来而改变,该版本增加了对多线程的支持。

并发和 CPU 绑定任务的挑战

在 JavaScript 中建立并发可能很困难。允许多个线程访问相同的内存会导致竞争状态,这不仅使故障难以重现,而且解决起来也很困难。

Node.js 最初被实现为基于异步 I/O 的服务器端平台。通过简单地消除线程需求,这使很多事情变得容易。是的,Node.js 程序是单线程的,但不是典型的方式。

我们可以在 Node.js 中并行运行,但是不需要创建线程。操作系统和虚拟机共同并行使用 I/O,然后在需要将数据发送回 JavaScript 代码时,JS 代码在单个线程中运行。

除 JS 代码外,所有内容均在 Node.js 中并行运行。与异步块不同,JS 的同步块总是一次执行一次。与代码执行相比,等待 JS 中产生 I/O 事件所花费的时间要多得多。

Node.js 程序仅调用所需的函数或回调,而不会阻止其他代码的执行。最初 JavaScript 和 Node.js 都不打算处理 CPU 密集型或 CPU 绑定的任务。

当代码最少时,执行将会是敏捷的。但是计算量越大,执行速度就越慢。

如果你仍然尝试在 JS 和 Node 中完成 CPU 密集型任务,那么将会使浏览器中的 UI 冻结并对所有 I/O 事件进行排队处理。尽管如此,我们已经走了很远。现在有了 worker_threads 模块。

worker_threads 模块使多线程变得简单

Node.js v10.5.0 于 2018 年 6 月发布,引入了 worker_threads 模块。它有助于在流行的 JavaScript 运行时环境中实现并发。该模块允许创建功能齐全的多线程 Node.js 应用。

从技术上讲,工作线程是在单独的线程中产生的一些代码。要开始使用辅助线程,需要先导入 worker_threads 模块。之后需要创建 Worker 类的实例以创建工作线程。

创建 Worker 类的实例时,有两个参数:

  • 第一个参数提供扩展名 .js 或 .mjs 的文件路径,其中包含工作程序线程的代码,
  • 第二个参数提供了一个包含 workerData 属性的对象,该属性包含工作线程开始执行时将访问的数据

辅助线程能够调度多个消息事件。因此,回调方法优先于返回 promise。

工作线程之间的通信是基于事件的,即侦听器设置为在工作线程发送事件后立即调用。最常见的 4 个事件是:

worker.on('error', (error) => {});

(1) 当工作线程中有未捕获的异常时发出。接下来工作线程终止,并且该错误可以作为回调中的第一个参数使用。

worker.on('exit', (exitCode) => {})

(2) 当辅助线程退出时发出。如果在工作线程中调用了 process.exit(),则会将 exitCode 提供给回调。如果 worker.terminate() 终止工作线程,则代码为 1。

worker.on('message', (data) => {});

(3) 当工作线程将数据发送到父线程时发出。

worker.on('online', () => {});

(4) 当工作线程停止解析 JS 代码并开始执行时发出。尽管不常用,但 online 事件在特定情况下可能会提供更多信息。

使用工作线程的方式

有两种使用工作线程的方法:

  • 方法 1 – 涉及产生工作线程,执行其代码并将结果发送到父线程。此方法需要每次为新任务从头创建新的 worker 线程。
  • 方法 2 – 涉及生成 worker 线程并为消息事件设置侦听器。每次触发该消息时,辅助线程都会执行代码,并将结果发送回父线程。辅助线程保持活动状态,以备将来使用。

方法 2 也被称为工作池。这是因为该方法涉及创建 worker 的工作池,先让他们等待,并在需要时去调度消息事件来执行任务。

由于从头创建工作线程需要创建虚拟机以及解析和执行代码,因此官方 Node.js 文档 建议采用方法 2。此外,方法 2 更为实用,比方法 1 更有效。

(1) worker_threads 模块中可用的重要属性

  • isMainThread – 当不在工作线程内操作时,此属性为 true。如果需要,则可以在 worker 文件的开头包含一个简单的 if 语句。这样可以确保它仅作为工作线程运行。
  • parentPort – MessagePort 的实例,用于与父线程进行通信。
  • threadId – 分配给工作线程的唯一标识符。
  • workerData – 包含在 worker 线程的构造函数中的数据。

(2) Node.js 中的多进程

为了使 Node.js 利用多核系统的功能,可以用一些进程。流行的 javascript 运行时环境中有称被为 cluster 的模块,该模块提供对多进程的支持。

使用 cluster 模块可以产生多个子进程,这些子进程可以共享一个公共端口。当子进程投入使用时,使用 NodeJS 的系统可以处理更大的工作量。

(3) 后端的 Node.js

互联网已经成为全球数以百万计公司的首选平台。因此,为使一家企业发挥最大潜力,并在此过程中脱颖而出,必须拥有强大的网络形象。

这一切都始于一个强大而直观的网站。要打造一个完美无瑕的网站,重要的是选择最佳的前端和后端技术。尽管本质上是单线程的,但 Node.js 是开发后端 Web 服务的首选。

尽管有大量的后端多线程选择,但知名公司还是喜欢 Node.js。这是因为 Node.js 提供了在 JavaScript 中使用多线程的变通方法,而 JavaScript 已经是“Web上最流行的编程语言”。

总结

worker_threads 模块提供了一种在 Node.js 程序中实现多线程的简便方法。通过将繁重的计算委派给工作线程,可以显着提高服务器的吞吐量。

借助对多线程的支持,Node.js 将继续吸引越来越多的来自 AI、大数据和机器学习等计算密集型领域的开发人员、工程师和其他专业人员。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
白跑一趟!阿德巴约83分!!也没能获奖!

白跑一趟!阿德巴约83分!!也没能获奖!

柚子说球
2026-07-16 21:09:07
难以置信,北京协和证实:40岁后男性最优运动,并非跑步撸铁

难以置信,北京协和证实:40岁后男性最优运动,并非跑步撸铁

华庭讲美食
2026-06-21 15:26:10
特朗普被曝在白宫战情室开会,讨论对伊大规模进攻的“可能方案”:包括夺取哈尔克岛、打击“镐山”隧道群、扩大空袭能源设施等;伊朗称摧毁美军多处中东基地设施

特朗普被曝在白宫战情室开会,讨论对伊大规模进攻的“可能方案”:包括夺取哈尔克岛、打击“镐山”隧道群、扩大空袭能源设施等;伊朗称摧毁美军多处中东基地设施

每日经济新闻
2026-07-16 23:17:45
西方专家怀疑:格雷厄姆抵华盛顿时已是尸体,基辅时已死亡

西方专家怀疑:格雷厄姆抵华盛顿时已是尸体,基辅时已死亡

地球记
2026-07-16 19:33:02
冬瓜被点名!发现:高血压病人吃冬瓜,不必等多久,或有5大变化

冬瓜被点名!发现:高血压病人吃冬瓜,不必等多久,或有5大变化

芹姐说生活
2026-07-16 19:56:12
CCTV5直播法国VS英格兰,开球时间有变,世界杯三四名奖金有多少

CCTV5直播法国VS英格兰,开球时间有变,世界杯三四名奖金有多少

体育大学僧
2026-07-16 10:37:09
这很科学:89%的人幻想过同时和多人发生性行为,算精神出轨吗?

这很科学:89%的人幻想过同时和多人发生性行为,算精神出轨吗?

宇宙时空
2026-05-26 18:20:10
广东男篮报价范子铭,北京首钢顶薪中锋遭冷落

广东男篮报价范子铭,北京首钢顶薪中锋遭冷落

桃叶渡春
2026-07-17 09:28:58
藏的太深了!跟中国学了一招,普通货轮突然射出导弹,全世界海军都被这招骗了

藏的太深了!跟中国学了一招,普通货轮突然射出导弹,全世界海军都被这招骗了

扬子的故事屋
2026-07-17 10:14:38
博主:梅西踩踏斯彭斯图片由AI生成,25号变成了23号

博主:梅西踩踏斯彭斯图片由AI生成,25号变成了23号

懂球帝
2026-07-16 23:04:03
邹市明2亿身家8年亏光!亏损项目流出,郭广昌回应妻子管钱:“你是开玩笑么,这不是过家家”

邹市明2亿身家8年亏光!亏损项目流出,郭广昌回应妻子管钱:“你是开玩笑么,这不是过家家”

火山詩话
2026-07-15 12:15:54
徐克医院崩溃痛哭!施南生上亿遗产早立遗嘱,一分钱都不留给前夫

徐克医院崩溃痛哭!施南生上亿遗产早立遗嘱,一分钱都不留给前夫

角落的隐藏美景
2026-07-17 01:10:02
哈兰德发文约“荷兰弟”吃晚饭,此前“荷兰弟”发私信约哈兰德吃饭,惨遭已读不回,哈兰德:平时不怎么看电影,不知道他是谁,没搭理他

哈兰德发文约“荷兰弟”吃晚饭,此前“荷兰弟”发私信约哈兰德吃饭,惨遭已读不回,哈兰德:平时不怎么看电影,不知道他是谁,没搭理他

极目新闻
2026-07-16 16:48:45
一辆特斯拉到底能开多少年?特斯拉官方回应

一辆特斯拉到底能开多少年?特斯拉官方回应

齐鲁壹点
2026-07-14 17:24:53
连续爆发4场,火箭队新秀场均23+3 合同仅1年保障 3大优势稳进轮换

连续爆发4场,火箭队新秀场均23+3 合同仅1年保障 3大优势稳进轮换

替补席看球
2026-07-17 10:48:46
澳洲录音遭疯传:杀光印度人!淹死印度孩子!印裔司机还不敢出声

澳洲录音遭疯传:杀光印度人!淹死印度孩子!印裔司机还不敢出声

阿鼵评论哥
2026-07-15 16:04:09
世界杯爆红!利物浦 1.28 亿锁定顶配神锋,完美接班萨拉赫

世界杯爆红!利物浦 1.28 亿锁定顶配神锋,完美接班萨拉赫

澜归序
2026-07-17 06:01:15
国务院任免国家工作人员

国务院任免国家工作人员

新华社
2026-07-16 17:50:06
江苏省无锡市中级人民法院悬赏公告

江苏省无锡市中级人民法院悬赏公告

无锡市中级人民法院
2026-07-16 22:08:18
没有激战,毫无还手之力:美国袭击了伊朗的桥梁和机场,多个省份重要交通线被中断

没有激战,毫无还手之力:美国袭击了伊朗的桥梁和机场,多个省份重要交通线被中断

一种观点
2026-07-17 09:01:25
2026-07-17 11:04:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

月之暗面发布Kimi K3,参数规模达2.8万亿

头条要闻

阿根廷球员赛后展示"马岛"标语 中方曾就马岛主权表态

头条要闻

阿根廷球员赛后展示"马岛"标语 中方曾就马岛主权表态

体育要闻

逆天6后卫神阵,图赫尔活活坑死英格兰

娱乐要闻

深扒邹市明的情史!爱得太卑微

财经要闻

全球科技股剧烈震荡

汽车要闻

圆滚滚的很可爱 长安启源Q06设计速览

态度原创

数码
亲子
旅游
手机
公开课

数码要闻

联想拯救者:Y700无极平板电脑握持区温度较主动散热手机低4℃

亲子要闻

阿杜和李佳到了外地,一路走来实属不容易,不过一切都是为了孩子

旅游要闻

伊春森工集团夏日森林康养月活动启幕 多元体验邀游客“森呼吸”

手机要闻

小米新机大曝光:阔折叠+18 Pro+18 Pro Max,均已在路上!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版