【Node】单线程的Node.js为什么可以实现多线程?

前言

很多刚接触 Node.js 的开发者都会有一个疑问:既然 Node.js 是单线程的,为什么又能使用 Worker Threads 这样的多线程模块呢?

今天我们就来解开这个看似矛盾的技术谜题。

👀 脑海里先有个印象:【Node.js 主线程】是单线程的,但【可以通过其他方式】实现并行处理

什么是 Node.js 的"单线程"?

事件循环(Event Loop)机制

javascript

体验AI代码助手

代码解读

复制代码

// 这是一个简单的 Node.js 程序 console.log('开始执行') setTimeout(() => { console.log('定时器回调') }, 1000) console.log('继续执行') // 输出顺序: // 开始执行 // 继续执行 // 定时器回调

核心特点

  • Node.js 有一个主线程负责执行 JavaScript 代码
  • 这个主线程运行着事件循环,按顺序处理任务
  • I/O 操作(文件读写、网络请求等)被【委托给系统底层】,不阻塞主线程

单线程的优势

javascript

体验AI代码助手

代码解读

复制代码

// 单线程模型简单易懂 let count = 0 function increment() { count++ console.log(count) } increment() // 输出 1 increment() // 输出 2 // 不用担心多线程的竞争条件问题

优点

  • ✅ 编程模型简单
  • ✅ 避免复杂的线程同步问题
  • ✅ 上下文切换开销小

那为什么还需要多线程?

单线程的局限性

javascript

体验AI代码助手

代码解读

复制代码

// CPU 密集型任务会阻塞事件循环 function heavyCalculation() { let result = 0 for (let i = 0; i < 1000000000; i++) { result += Math.sqrt(i) * Math.sin(i) } return result } console.log('任务开始') heavyCalculation() // 在这期间,其他任务都无法执行! console.log('任务结束,但用户界面会卡住')

问题暴露

  • 一个复杂的计算任务会阻塞整个应用程序
  • 无法充分利用多核 CPU 的性能
  • 对于计算密集型应用性能受限

解开谜题:Node.js 的多线程能力

底层真相:Node.js 不是完全单线程!!!

实际上,Node.js 的架构是下面这样的:

css

体验AI代码助手

代码解读

复制代码

┌─────────────────────────────┐ │ Node.js 进程 │ ├─────────────────────────────┤ │ ┌─────────────────────┐ │ │ │ JavaScript主线程 │ ← 我们写的代码在这里运行! │ └─────────────────────┘ │ │ │ │ ┌─────────────────────┐ │ │ │ libuv线程池 │ ← 处理文件I/O、DNS等 │ └─────────────────────┘ │ │ │ │ ┌─────────────────────┐ │ │ │ V8后台线程 │ ← 垃圾回收等 │ └─────────────────────┘ │ └─────────────────────────────┘

重点需要理解的内容

  • JavaScript 执行环境是单线程的。
  • Node.js 运行时本身使用了多线程
  • libuv 库提供了线程池来处理某些类型的 I/O 操作

补充知识:

Node.js 的 JavaScript 执行环境确实是单线程的,这意味着你的 JavaScript 代码是在一个主线程中顺序执行的,这个主线程运行着事件循环机制。

然而,Node.js 运行时本身是基于 C++ 的,它内部使用了多线程技术:libuv 这个底层库提供了一个线程池,当 JavaScript 代码执行到某些特定的异步 I/O 操作(如文件系统操作、DNS 查找等)时,这些任务会被提交到 libuv 的线程池中由后台线程执行,从而避免阻塞 JavaScript 主线程;

此外,V8 引擎也会使用一些后台线程来处理垃圾回收等任务。

所以,JavaScript 代码的执行是单线程的,但 Node.js 平台的底层实现是多线程的。

Worker Threads 的工作原理

javascript

体验AI代码助手

代码解读

复制代码

const {Worker, isMainThread} = require('worker_threads') if (isMainThread) { // 这是在主线程 console.log('主线程 ID:', process.pid) // 创建新的工作线程 const worker = new Worker( ` const { parentPort } = require('worker_threads'); console.log('工作线程中执行'); parentPort.postMessage('来自工作线程的消息'); `, {eval: true} ) worker.on('message', msg => { console.log('主线程收到:', msg) }) } else { // 这是在工作线程中(这段代码不会在这里执行) }

工作机制

  1. 每个 Worker Thread 都有自己独立的 JavaScript 执行环境
  2. 工作线程与主线程内存不共享(但可以通过 SharedArrayBuffer 共享)
  3. 线程间通过消息传递进行通信

为什么这样设计?

历史演进

  1. 最初设计:专注于 I/O 密集型任务,单线程+事件循环足够高效
  2. 需求变化:JavaScript 应用场景扩展到计算密集型领域
  3. 技术演进:引入 Worker Threads 来弥补单线程的不足

设计哲学

javascript

体验AI代码助手

代码解读

复制代码

// 正确的使用方式:主线程负责协调,工作线程负责计算 class TaskManager { async processBigData(data) { // 主线程:任务分发和结果收集 const promises = data.chunks.map(chunk => this.runInWorker('./calculation-worker.js', chunk)) // 不阻塞主线程,可以同时处理其他请求 const results = await Promise.all(promises) return this.aggregateResults(results) } }

这样设计的好处

  • 保持主线程的轻量和响应性
  • 将重型计算卸载到工作线程
  • 既享受单线程的简单性,又获得多线程的计算能力

下面举一些现实开发中的应用 🌰

🌰 例子 1:Web 服务器中的计算任务

javascript

体验AI代码助手

代码解读

复制代码

const express = require('express') const {Worker} = require('worker_threads') const app = express() app.get('/fast-request', (req, res) => { // 快速响应,不阻塞 res.json({status: 'ok', message: '立即返回'}) }) app.get('/heavy-calculation', async (req, res) => { // 重型计算交给工作线程 const result = await runInWorker('./heavy-math.js', req.query.data) res.json({result}) }) // 主线程始终保持响应

🌰 例子 2:数据处理管道

javascript

体验AI代码助手

代码解读

复制代码

async function processLargeDataset(dataset) { const chunkSize = Math.ceil(dataset.length / 4) // 分成4份 const workers = [] for (let i = 0; i < 4; i++) { const chunk = dataset.slice(i * chunkSize, (i + 1) * chunkSize) workers.push(createWorker('./data-processor.js', chunk)) } // 并行处理,大大加快速度 const results = await Promise.all(workers) return results.flat() }

✍️ 总结

核心要点回顾

  1. Node.js 的单线程指的是 JavaScript 执行环境是单线程的
  2. 底层实现使用了多线程技术来处理 I/O 等操作
  3. Worker Threads让我们能够在应用层面使用多线程能力
  4. 设计目标是保持【主线程的响应性】,同时获得并行计算的好处

👍 最佳实践

  • 常规 I/O 操作:使用原生 Node.js 单线程 + 异步模式
  • CPU 密集型任务:使用 Worker Threads 避免阻塞主线程
  • 高并发 Web 服务:使用 Cluster 模块充分利用多核 CPU

😎 回答标题的问题

Node.js 既是单线程的,又支持多线程,这并不矛盾:

  • 单线程:指 JavaScript 代码的执行方式,简化编程模型
  • 多线程能力:通过底层库和 Worker Threads 模块提供,解决性能瓶颈

作者:你的人类朋友
链接:https://juejin.cn/post/7557347203514515494
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1135021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全微调指南:避免Llama Factory中的敏感信息泄露

安全微调指南&#xff1a;避免Llama Factory中的敏感信息泄露 在企业使用客户数据进行大模型微调时&#xff0c;数据安全和隐私保护是首要考虑的问题。本文将介绍如何在使用Llama Factory进行模型微调时&#xff0c;避免敏感信息泄露&#xff0c;确保数据处理和模型训练过程的安…

GeoJSON零基础教程:用简单英语创建你的第一个地图数据

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个面向新手的GeoJSON生成向导&#xff0c;通过三步引导&#xff1a;1) 选择要素类型&#xff08;点/线/面&#xff09;2) 用自然语言描述位置&#xff08;如天安门广场的矩形…

Win11安装Python全流程实战:从下载到第一个程序

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个交互式Python安装指南应用&#xff0c;包含以下功能&#xff1a;1.分步骤展示安装过程 2.提供实时截图和说明 3.内置终端模拟器运行简单Python代码 4.常见错误解决方案查询…

Sambert-HifiGan语音合成效果主观评价方法

Sambert-HifiGan语音合成效果主观评价方法 引言&#xff1a;中文多情感语音合成的用户体验挑战 随着深度学习在语音合成&#xff08;Text-to-Speech, TTS&#xff09;领域的持续突破&#xff0c;Sambert-HifiGan 作为ModelScope平台上的经典端到端中文语音合成模型&#xff0c;…

基于物联网的智能图书馆监控系统的设计

二、基于物联网的智能图书馆系统关键技术 &#xff08;一&#xff09;物联网技术 1.物联网的定义 物联网&#xff0c;物物相连的互联网。物联网可以定义为&#xff1a;把所有物品通过信息传感设备与互联网连接起来&#xff0c;实现智能化辨识、运作与管理功能的网络。 其次&am…

深入剖析 XXE 漏洞及其修复思路

目录 深入剖析 XXE 漏洞及其修复思路 一、XXE 漏洞是什么 二、XXE 漏洞的利用 &#xff08;一&#xff09;有回显的 XXE 漏洞利用 &#xff08;二&#xff09;无回显的 XXE 漏洞利用 三、XXE 漏洞修复思路 &#xff08;一&#xff09;禁用外部实体 &#xff08;二&#xff09;严…

语音合成的版权保护:Sambert-HifiGan的声纹水印技术

语音合成的版权保护&#xff1a;Sambert-HifiGan的声纹水印技术 &#x1f4cc; 引言&#xff1a;中文多情感语音合成的技术演进与版权挑战 随着深度学习在语音合成&#xff08;Text-to-Speech, TTS&#xff09;领域的持续突破&#xff0c;基于神经网络的端到端模型如 Sambert-H…

Kaggle夺冠密码:LLaMA Factory比赛专用微调模板

Kaggle夺冠密码&#xff1a;LLaMA Factory比赛专用微调模板 参加NLP竞赛时&#xff0c;你是否也经常在baseline代码调试上浪费大量时间&#xff1f;数据预处理、模型微调、评估脚本……这些重复性工作占据了参赛者一半以上的精力。今天我要分享的Kaggle夺冠密码&#xff1a;LLa…

企业级语音方案:Sambert-HifiGan集群部署实战

企业级语音方案&#xff1a;Sambert-HifiGan集群部署实战 引言&#xff1a;中文多情感语音合成的业务需求与挑战 随着智能客服、有声阅读、虚拟主播等AI应用场景的不断深化&#xff0c;高质量、富有情感表现力的中文语音合成&#xff08;TTS&#xff09; 已成为企业级语音服务…

Llama Factory极速入门:1小时掌握大模型微调核心技巧

Llama Factory极速入门&#xff1a;1小时掌握大模型微调核心技巧 作为一名IT转行AI的新手&#xff0c;面对大模型微调这个看似高深的领域&#xff0c;你是否也感到无从下手&#xff1f;本文将带你快速掌握Llama Factory的核心使用技巧&#xff0c;让你在1小时内完成从零到微调…

CRNN OCR在医疗问诊的应用:处方自动识别与提醒

CRNN OCR在医疗问诊的应用&#xff1a;处方自动识别与提醒 &#x1f4d6; 项目背景&#xff1a;OCR技术如何赋能医疗智能化 在现代医疗场景中&#xff0c;医生每天需要处理大量纸质或手写处方单&#xff0c;这些非结构化文本信息不仅录入效率低&#xff0c;还容易因字迹潦草、术…

3分钟搞定RPGVXACE RTP问题的原型工具

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个最小可行产品(MVP)工具&#xff0c;能够在3分钟内解决RPGVXACE RTP缺失问题。工具应极度简化流程&#xff1a;用户打开工具后&#xff0c;只需点击一个按钮&#xff0c;工…

一小时实战:用云端GPU快速微调你的第一个Llama 3模型

一小时实战&#xff1a;用云端GPU快速微调你的第一个Llama 3模型 大型语言模型&#xff08;LLM&#xff09;微调是让模型适应特定任务的关键技术&#xff0c;但对于编程培训班的学生来说&#xff0c;本地电脑配置不足往往成为实践障碍。本文将带你通过云端GPU环境&#xff0c;使…

AI全景之第十二章第二节:神经科学启发的新一代AI架构

12.2 神经科学启发的新一代AI架构 当前主流AI架构(如Transformer、CNN)虽在特定任务上展现出超越人类的性能,但本质上仍属于“统计拟合”范式,存在能耗过高、灾难性遗忘、动态环境适应性差等固有缺陷。与之形成鲜明对比的是,生物大脑经过亿万年进化,已形成一套高效、鲁棒…

Llama Factory安全指南:企业级模型开发最佳实践

Llama Factory安全指南&#xff1a;企业级模型开发最佳实践 在金融机构等对安全性要求极高的场景中&#xff0c;AI团队常常面临开发环境合规性挑战。Llama Factory作为企业级大模型开发框架&#xff0c;提供了一套开箱即用的安全解决方案&#xff0c;帮助团队快速构建符合严格安…

Python注释:传统手写 vs AI生成效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Python注释效率对比工具&#xff1a;1. 准备一组未注释的示例代码 2. 分别记录手动注释和AI生成注释的时间 3. 比较两种方式的注释质量 4. 生成对比报告 5. 提供效率提升建…

电商系统GC问题实战:从OVERHEAD LIMIT到性能优化

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个电商订单处理系统的内存监控模块&#xff0c;专门针对GC OVERHEAD LIMIT场景。要求&#xff1a;1) 实时监控订单处理线程的内存使用&#xff1b;2) 在接近GC限制阈值时自动…

HW重保蓝队Top 30类高频面试题清单

HW重保蓝队Top 30类高频面试题清单 SQL 注入正向代理和反向代理的区别蚁剑 / 菜刀 / 冰蝎异同Windows 提权类型与方法Linux 提权XSSCSRF 攻击Docker 及相关应用Burp 模块OWASP TOP10数据库及类型常见的中间件漏洞IISApacheNginxTomcatWeblogic内网渗透思路正向 SHELL 和反向 S…

学霸同款2026 10款一键生成论文工具测评:毕业论文写作全攻略

学霸同款2026 10款一键生成论文工具测评&#xff1a;毕业论文写作全攻略 2026年学术写作工具测评&#xff1a;如何挑选适合你的论文助手 随着人工智能技术的不断发展&#xff0c;越来越多的学生开始依赖AI工具来辅助论文写作。然而&#xff0c;面对市场上琳琅满目的论文生成软件…

DEEPANALYZE:AI如何革新代码分析与优化

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于DEEPANALYZE的AI代码分析工具&#xff0c;能够自动扫描代码库&#xff0c;识别潜在的性能瓶颈、安全漏洞和代码异味。工具应支持多种编程语言&#xff08;如Python、J…