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

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.

相关推荐
热点推荐
事业编制开除难,网友吐槽辞职三年只得单间办公室。

事业编制开除难,网友吐槽辞职三年只得单间办公室。

特约前排观众
2026-01-10 00:15:05
孙俪的眼神好凶,不仅用眼睛瞪人表情也不耐烦,助理更是直接赶人

孙俪的眼神好凶,不仅用眼睛瞪人表情也不耐烦,助理更是直接赶人

有趣的胡侃
2026-01-08 10:21:25
安徽小伙在小国家创业,“享受”一夫多妻、开放生活的他如今怎样

安徽小伙在小国家创业,“享受”一夫多妻、开放生活的他如今怎样

牛牛叨史
2026-01-06 12:59:43
或比中国卫星还猛!脑机接口商用开启  10大龙头技术和产品已落地

或比中国卫星还猛!脑机接口商用开启 10大龙头技术和产品已落地

元芳说投资
2026-01-09 06:00:09
篮板第1+盖帽第1!中国男篮17岁2米13新星崛起:新韩德君轰33+16

篮板第1+盖帽第1!中国男篮17岁2米13新星崛起:新韩德君轰33+16

李喜林篮球绝杀
2026-01-10 11:55:51
为何不许大陆统台?特朗普说了实话:中国统一后,将颠覆全世界

为何不许大陆统台?特朗普说了实话:中国统一后,将颠覆全世界

文史旺旺旺
2026-01-09 18:03:22
闫学晶事件升级!官媒批评毫不留情,赵家班多人受牵连,麻烦大了

闫学晶事件升级!官媒批评毫不留情,赵家班多人受牵连,麻烦大了

李健政观察
2026-01-10 09:25:10
勇士34分狂胜国王,库里27+10,创NBA79年纪录,前无古人后无来者

勇士34分狂胜国王,库里27+10,创NBA79年纪录,前无古人后无来者

毒舌NBA
2026-01-10 13:24:50
给2025年最好的10部动作片排个名:《匿杀》第7,《捕风追影》第2

给2025年最好的10部动作片排个名:《匿杀》第7,《捕风追影》第2

皮皮电影
2026-01-04 09:50:59
一百多年前,康有为花费 150 万在欧洲购得一座岛,时至今日,这座岛的产权到底归谁所有?

一百多年前,康有为花费 150 万在欧洲购得一座岛,时至今日,这座岛的产权到底归谁所有?

源溯历史
2026-01-02 18:50:36
为什么全网都在“针对”小米雷军?

为什么全网都在“针对”小米雷军?

首席商业评论
2026-01-09 13:23:54
2026开年王炸级新车来了!8.98万起买到210KM长续航+云辇-C

2026开年王炸级新车来了!8.98万起买到210KM长续航+云辇-C

大侠上车
2026-01-10 07:06:56
被弹劾!特朗普开始着急了,最坏结果出现,要将中国当成救命稻草

被弹劾!特朗普开始着急了,最坏结果出现,要将中国当成救命稻草

朔方瞭望
2026-01-10 11:56:21
央行金融研究所所长丁志杰:部分长期资本仍沉淀在银行体系 优化金融结构大力发展资本市场

央行金融研究所所长丁志杰:部分长期资本仍沉淀在银行体系 优化金融结构大力发展资本市场

证券时报
2026-01-10 17:35:14
87分钟绝杀!越南2连胜登顶 基本进U23亚洲杯8强 国足战澳大利亚

87分钟绝杀!越南2连胜登顶 基本进U23亚洲杯8强 国足战澳大利亚

侃球熊弟
2026-01-09 23:58:25
CCTV5直播!辽宁VS广东焦点战,亨特上演首秀,杜锋要给杨鸣上课

CCTV5直播!辽宁VS广东焦点战,亨特上演首秀,杜锋要给杨鸣上课

老叶评球
2026-01-09 22:50:16
今日北风呼啸,双休日气温持续低迷,下周一开始缓慢回升

今日北风呼啸,双休日气温持续低迷,下周一开始缓慢回升

新京报
2026-01-10 12:33:26
同是TVB视帝,身家差距在哪?一个手握十套房产,一个背上一身房贷?!

同是TVB视帝,身家差距在哪?一个手握十套房产,一个背上一身房贷?!

港房研究所
2026-01-08 20:04:33
离春节还剩30多天,提醒:6种年货提前买,先存起来,不花冤枉钱

离春节还剩30多天,提醒:6种年货提前买,先存起来,不花冤枉钱

阿龙美食记
2026-01-09 19:10:49
瑞典,挪威,芬兰北欧三国地处恶劣寒地,经济实力为何如此强大呢

瑞典,挪威,芬兰北欧三国地处恶劣寒地,经济实力为何如此强大呢

向航说
2025-12-17 00:05:03
2026-01-10 19:44:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

传DeepSeek准备第二次震惊全世界

头条要闻

特朗普宣称"我不需要国际法" 墨西哥成美新的打击目标

头条要闻

特朗普宣称"我不需要国际法" 墨西哥成美新的打击目标

体育要闻

怒摔水瓶!杜兰特30+12 难阻火箭遭双杀

娱乐要闻

吴速玲曝儿子Joe是恋爱脑

财经要闻

这不算诈骗吗?水滴保诱导扣款惹众怒

汽车要闻

宝马25年全球销量246.3万台 中国仍是第一大市场

态度原创

教育
游戏
家居
亲子
房产

教育要闻

2027考研变化!这些专业,要求具备工作经验

FF13三部曲重制有望?年轻开发者情怀或成关键推动力

家居要闻

木色留白 演绎现代自由

亲子要闻

阿钟的小毛驴糖果小故事

房产要闻

66万方!4755套!三亚巨量房源正疯狂砸出!

无障碍浏览 进入关怀版