进程和线程如何理解?Node.js中的进程和线程是怎样的?

线程进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?node中的进程和线程又是怎样的呢?下面本篇文章就来一起了解一下,希望对大家有所帮助!

进程和线程如何理解?Node.js中的进程和线程是怎样的?

一、进程和线程

1.1、专业性文字定义

进程(Process),进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器。线程(Thread),线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。

1.2、通俗理解

以上描述比较硬,看完可能也没看懂,还不利于理解记忆。那么我们举个简单的例子:

假设你是某个快递站点的一名小哥,起初这个站点负责的区域住户不多,收取件都是你一个人。给张三家送完件,再去李四家取件,事情得一件件做,这叫单线程,所有的工作都得按顺序执行

后来这个区域住户多了,站点给这个区域分配了多个小哥,还有个小组长,你们可以为更多的住户服务了,这叫多线程,小组长是主线程,每个小哥都是一个线程

快递站点使用的小推车等工具,是站点提供的,小哥们都可以使用,并不仅供某一个人,这叫多线程资源共享。

站点小推车目前只有一个,大家都需要使用,这叫冲突。解决的方法有很多,排队等待或者等其他小哥用完后的通知,这叫线程同步

file

总公司有很多站点,各个站点的运营模式几乎一模一样,这叫多进程。总公司叫主进程,各个站点叫子进程
总公司和站点之间,以及各个站点互相之间,小推车都是相互独立的,不能混用,这叫进程间不共享资源。各站点间可以通过电话等方式联系,这叫管道。各站点间还有其他协同手段,便于完成更大的计算任务,这叫进程间同步

还可以看看阮一峰的 进程与线程的一个简单解释。

二、Node.js 中的进程和线程

Node.js 是单线程服务,事件驱动和非阻塞 I/O 模型的语言特性,使得 Node.js 高效和轻量。优势在于免去了频繁切换线程和资源冲突;擅长 I/O 密集型操作(底层模块 libuv 通过多线程调用操作系统提供的异步 I/O 能力进行多任务的执行),但是对于服务端的 Node.js,可能每秒有上百个请求需要处理,当面对 CPU 密集型请求时,因为是单线程模式,难免会造成阻塞。

2.1、Node.js 阻塞

我们利用 Koa 简单地搭建一个 Web 服务,用斐波那契数列方法来模拟一下 Node.js 处理 CPU 密集型的计算任务:

斐波那契数列,也称黄金分割数列,这个数列从第三项开始,每一项都等于前两项只和:0、1、1、2、3、5、8、13、21、……

// app.jsconst Koa = require('koa')const router = require('koa-router')()const app = new Koa()// 用来测试是否被阻塞router.get('/test', (ctx) => {    ctx.body = {        pid: process.pid,        msg: 'Hello World'    }})router.get('/fibo', (ctx) => {    const { num = 38 } = ctx.query    const start = Date.now()    // 斐波那契数列    const fibo = (n) => {        return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1    }    fibo(num)    ctx.body = {        pid: process.pid,        duration: Date.now() - start    }})app.use(router.routes())app.listen(9000, () => {    console.log('Server is running on 9000')})

执行 node app.js 启动服务,用 Postman 发送请求,可以看到,计算 38 次耗费了 617ms,换而言之,因为执行了一个 CPU 密集型的计算任务,所以 Node.js 主线程被阻塞了六百多毫秒。如果同时处理更多的请求,或者计算任务更复杂,那么在这些请求之后的所有请求都会被延迟执行。

file

我们再新建一个 axios.js 用来模拟发送多次请求,此时将 app.js 中的 fibo 计算次数改为 43,用来模拟更复杂的计算任务:

// axios.jsconst axios = require('axios')const start = Date.now()const fn = (url) => {    axios.get(`http://127.0.0.1:9000/${ url }`).then((res) => {        console.log(res.data, `耗时: ${ Date.now() - start }ms`)    })}fn('test')fn('fibo?num=43')fn('test')

file

可以看到,当请求需要执行 CPU 密集型的计算任务时,后续的请求都被阻塞等待,这类请求一多,服务基本就阻塞卡死了。对于这种不足,Node.js 一直在弥补。

2.2、master-worker

master-worker 模式是一种并行模式,核心思想是:系统有两个及以上的进程或线程协同工作时,master 负责接收和分配并整合任务,worker 负责处理任务。

file

2.3、多线程

线程是 CPU 调度的一个基本单位,只能同时执行一个线程的任务,同一个线程也只能被一个 CPU 调用。如果使用的是多核 CPU,那么将无法充分利用 CPU 的性能。

多线程带给我们灵活的编程方式,但是需要学习更多的 Api 知识,在编写更多代码的同时也存在着更多的风险,线程的切换和锁也会增加系统资源的开销。

worker_threads 工作线程,给 Node.js 提供了真正的多线程能力。

worker_threads 是 Node.js 提供的一种多线程 Api。对于执行 CPU 密集型的计算任务很有用,对 I/O 密集型的操作帮助不大,因为 Node.js 内置的异步 I/O 操作比 worker_threads 更高效。worker_threads 中的 Worker,parentPort 主要用于子线程和主线程的消息交互。

将 app.js 稍微改动下,将 CPU 密集型的计算任务交给子线程计算:

// app.jsconst Koa = require('koa')const router = require('koa-router')()const { Worker } = require('worker_threads')const app = new Koa()// 用来测试是否被阻塞router.get('/test', (ctx) => {    ctx.body = {        pid: process.pid,        msg: 'Hello World'    }})router.get('/fibo', async (ctx) => {    const { num = 38 } = ctx.query    ctx.body = await asyncFibo(num)})const asyncFibo = (num) => {    return new Promise((resolve, reject) => {        // 创建 worker 线程并传递数据        const worker = new Worker('./fibo.js', { workerData: { num } })        // 主线程监听子线程发送的消息        worker.on('message', resolve)        worker.on('error', reject)        worker.on('exit', (code) => {            if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`))        })    })}app.use(router.routes())app.listen(9000, () => {    console.log('Server is running on 9000')})

新增 fibo.js 文件,用来处理复杂计算任务:

豆包AI编程 豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483 查看详情 豆包AI编程

const { workerData, parentPort } = require('worker_threads')const { num } = workerDataconst start = Date.now()// 斐波那契数列const fibo = (n) => {    return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1}fibo(num)parentPort.postMessage({    pid: process.pid,    duration: Date.now() - start})

执行上文的 axios.js,此时将 app.js 中的 fibo 计算次数改为 43,用来模拟更复杂的计算任务:

file

可以看到,将 CPU 密集型的计算任务交给子线程处理时,主线程不再被阻塞,只需等待子线程处理完成后,主线程接收子线程返回的结果即可,其他请求不再受影响。
上述代码是演示创建 worker 线程的过程和效果,实际开发中,请使用线程池来代替上述操作,因为频繁创建线程也会有资源的开销。

线程是 CPU 调度的一个基本单位,只能同时执行一个线程的任务,同一个线程也只能被一个 CPU 调用。

我们再回味下,本小节开头提到的线程和 CPU 的描述,此时由于是新的线程,可以在其他 CPU 核心上执行,可以更充分的利用多核 CPU。

2.4、多进程

Node.js 为了能充分利用 CPU 的多核能力,提供了 cluster 模块,cluster 可以通过一个父进程管理多个子进程的方式来实现集群的功能。

child_process 子进程,衍生新的 Node.js 进程并使用建立的 IPC 通信通道调用指定的模块。cluster 集群,可以创建共享服务器端口的子进程,工作进程使用 child_process 的 fork 方法衍生。

cluster 底层就是 child_process,master 进程做总控,启动 1 个 agent 进程和 n 个 worker 进程,agent 进程处理一些公共事务,比如日志等;worker 进程使用建立的 IPC(Inter-Process Communication)通信通道和 master 进程通信,和 master 进程共享服务端口。

file

新增 fibo-10.js,模拟发送 10 次请求:

// fibo-10.jsconst axios = require('axios')const url = `http://127.0.0.1:9000/fibo?num=38`const start = Date.now()for (let i = 0; i  {        console.log(res.data, `耗时: ${ Date.now() - start }ms`)    })}

可以看到,只使用了一个进程,10 个请求慢慢阻塞,累计耗时 15 秒:

file

接下来,将 app.js 稍微改动下,引入 cluster 模块:

// app.jsconst cluster = require('cluster')const http = require('http')const numCPUs = require('os').cpus().length// const numCPUs = 10 // worker 进程的数量一般和 CPU 核心数相同const Koa = require('koa')const router = require('koa-router')()const app = new Koa()// 用来测试是否被阻塞router.get('/test', (ctx) => {    ctx.body = {        pid: process.pid,        msg: 'Hello World'    }})router.get('/fibo', (ctx) => {    const { num = 38 } = ctx.query    const start = Date.now()    // 斐波那契数列    const fibo = (n) => {        return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1    }    fibo(num)    ctx.body = {        pid: process.pid,        duration: Date.now() - start    }})app.use(router.routes())if (cluster.isMaster) {    console.log(`Master ${process.pid} is running`)        // 衍生 worker 进程    for (let i = 0; i  {        console.log(`worker ${worker.process.pid} died`)    })} else {    app.listen(9000)    console.log(`Worker ${process.pid} started`)}

执行 node app.js 启动服务,可以看到,cluster 帮我们创建了 1 个 master 进程和 4 个 worker 进程:

file

file

通过 fibo-10.js  模拟发送 10 次请求,可以看到,四个进程处理 10 个请求耗时近 9 秒:

file

当启动 10 个 worker 进程时,看看效果:

file

仅需不到 3 秒,不过进程的数量也不是无限的。在日常开发中,worker 进程的数量一般和 CPU 核心数相同。

2.5、多进程说明

开启多进程不全是为了处理高并发,而是为了解决 Node.js 对于多核 CPU 利用率不足的问题。
由父进程通过 fork 方法衍生出来的子进程拥有和父进程一样的资源,但是各自独立,互相之间资源不共享。通常根据 CPU 核心数来设置进程数量,因为系统资源是有限的。

三、总结

1、大部分通过多线程解决 CPU 密集型计算任务的方案都可以通过多进程方案来替代;
2、Node.js 虽然异步,但是不代表不会阻塞,CPU 密集型任务最好不要在主线程处理,保证主线程的畅通;
3、不要一味的追求高性能和高并发,达到系统需要即可,高效、敏捷才是项目需要的,这也是 Node.js 轻量的特点。
4、Node.js 中的进程和线程还有很多概念在文章中提到了但没展开细讲或没提到的,比如:Node.js 底层 I/O 的 libuv、IPC 通信通道、多进程如何守护、进程间资源不共享如何处理定时任务、agent 进程等;
5、以上代码可在 https://github.com/liuxy0551/node-process-thread 查看。

更多node相关知识,请访问:nodejs 教程!

以上就是进程和线程如何理解?Node.js中的进程和线程是怎样的?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/549348.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 19:17:43
下一篇 2025年11月9日 19:18:32

相关推荐

  • PHP如何调用Node.js脚本 调用Node.js的3种实用技巧

    php调用node.js脚本有三种主要方法:1.exec()、shell_exec()、system()函数可直接执行命令,但需注意安全性和异步处理;2.使用消息队列(如rabbitmq、redis)实现解耦和异步任务处理,需配置持久化与确认机制;3.通过http api调用node.js构建的服务…

    2025年12月10日 好文分享
    000
  • 如何使用 PHP 调用 Node.js 模块?

    本教程指导如何在 php 中使用 php-node 模块调用 node.js 模块:安装 php-node 模块(通过 composer)。创建一个 node.js 模块并导出方法。在 php 中使用 nodeprocess 加载和调用 node.js 模块。实战案例展示了如何使用 php 从 ex…

    2025年12月9日
    000
  • 什么是加密货币的“市值 dominance”?用它判断市场风向

    市值 dominance是衡量加密货币市场资金流向的核心指标,反映比特币或以太坊等头部资产的市值占比。其计算公式为(某币种市值 ÷ 市场总市值)×100%,数值上升表明避险情绪升温,资金集中于主流币;下降则代表投机活跃,资金流入山寨币。比特币dominance(BTC.D)被视为市场风向标:当BTC…

    2025年12月9日
    000
  • 分析师Glassnode警告瑞波币(XRP)”结构性脆弱”,41.5%供应量处于亏损状

    Binance币安 欧易OKX ️ Huobi火币️ XRP的盈利供应量已跌至过去一年来的最低点,一位市场观察人士警告称,若投资者开始平仓止损,价格可能面临进一步下行压力。在此背景下,XRP ETF的推出能否重燃多头信心? 据分析指出,若XRP短期内无法实现显著反弹,市场或将迎来更多抛压,因为当前有…

    2025年12月9日
    000
  • Coinbase深度分析:加密市场一万亿美元的回撤掩盖了比特币(BTC)的强劲基本面

    Binance币安 欧易OKX ️ Huobi火币️ 尽管加密市场蒸发了1万亿美元,Coinbase的一位高管表示,比特币(BTC)的下跌是结构性的,而非看跌,因为自9月价格高点以来,其基本面并未发生太多变化。 要点介绍: BTC基本面在加密货币总市值下跌1万亿美元的情况下仍保持完好。长期持有者和机…

    2025年12月9日
    000
  • 什么是Horizen Network(ZEN)?ZEN币怎么购买?

    horizen network(zen)是一个去中心化的区块链平台,致力于提供端到端加密、匿名性和可配置的隐私保护。它基于零知识证明技术,旨在解决传统区块链在隐私方面的局限性,允许用户在公共区块链上进行安全、私密的交易和数据传输。zen币是horizen网络的原生加密资产,用于支付交易费用、参与网络…

    2025年12月9日
    000
  • SOL币的升级提案是什么?如何跟踪网络改进?

    SOL币的升级提案通过SIPs库公开管理,用户可访问GitHub查看提案详情并跟踪状态;利用Solana Beach等工具监控链上指标如节点版本分布与TPS变化;订阅@solana官方X账号、加入Discord社区及查阅博客获取最新进展。 SOL币的升级提案是推动网络性能与功能迭代的核心机制,用户可…

    2025年12月9日
    000
  • 比特币跌破9万美元后,反弹点在哪?

    Binance币安 欧易OKX ️ Huobi火币️ 比特币突破性下跌:现状回顾 随着比特币价格跌破 $90,000,市场触发了新的波动阶段。根据最新报道,这一跌破标志着风险偏好急剧收缩,并抹去了大部分 2025 年的涨幅。此前的关键支撑未能守住,引发投资者对中期下行的担忧。 技术面关键支撑与中期风…

    2025年12月9日
    000
  • 如何查看瑞波币实时行情?哪些工具能提供准确数据?

    瑞波币实时行情显示,XRP价格在2.35至2.50美元区间波动,24小时成交量超18亿,市值约147亿美元,受ETF预期及链上大额转账影响,市场多空博弈加剧,投资者需关注2.40美元关键支撑位与监管动态。 查看瑞波币实时行情需借助专业数据平台,确保信息及时准确。 一、使用主流行情网站 专业的加密货币…

    2025年12月9日
    000
  • ETH以太坊未来展望:价格趋势与应用场景预测

    以太坊价格受技术发展影响显著,通过分析链上数据、Layer 2生态扩张、协议升级及机构持仓可判断其长期趋势:大型地址动向与交易所净流出反映持有意愿;L2 TVL与活跃度提升表明扩展性改善;核心协议升级推进效率优化;机构增持则预示资金持续布局。 以太坊作为智能合约平台,其价格与技术发展紧密相关。当前市…

    2025年12月9日
    000
  • 瑞波币社区治理模式是什么?参与者如何影响决策?

    瑞波币社区治理结合中心化与去中心化特征,核心节点需51%以上同意新节点加入,瑞波公司初期影响力大;重大更新通过论坛征集社区意见,开发团队据此调整方案;XRP持有者虽无链上投票权,但通过舆论、交易行为和市场需求间接影响项目方向。 瑞波币的社区治理模式具有独特的中心化与去中心化结合特征,参与者通过多种方…

    2025年12月9日
    000
  • 以太坊价格暴涨在即?专家预测2025年关键节点

    以太坊2025年或迎暴涨,链上鲸鱼吸筹、ETF资金流入及技术升级成关键驱动。持有1,000枚以上ETH地址持续净流入、单笔超5,000 ETH转出交易所、NUPL低于0.5显示底部信号;美国现货ETF若连续三日净流入破亿美元,叠加贝莱德等机构进场,将强化上涨动能;zkEVM主网集成、Gas费降60%…

    2025年12月9日
    000
  • BTC价格预测:2025-2040年关键支撑位与目标价位全解析

    BTC价格预测:2025-2040年关键支撑位与目标价位全解析比特币(BTC)作为加密货币领域的领军者,其价格动态始终牵动着全球投资者的神经。本文将从技术面、市场情绪及资金流动等维度,深入剖析BTC在2025至2040年间的长期走势,并结合最新数据提供专业级价格展望。 当前BTC价格走势分析 BTC…

    2025年12月9日
    000
  • 欧易交易所APP端入门攻略:新手必看的全流程教学

    欧易是全球领先的数字资产服务平台,拥有全球顶级专家组成的安全团队,可以为您的资产提供银行级的安全存储和保护。 Binance币安 欧易OKX ️ Huobi火币️ 首次使用欧易平台的用户,可以通过此文快速学会交易比特币等数字资产,整体分为三步:一、交易前设置;二、买卖币交易;三、现货交易。 第一步:…

    2025年12月9日 好文分享
    000
  • 币圈行情网站哪个好_十大币圈行情网站盘点

    对于加密货币投资者而言,一个功能强大、数据精准的行情网站至关重要,它不仅能提供实时的价格波动,还能帮助分析市场趋势。本文将盘点当前市场上最主流和备受好评的十大币圈行情网站,帮助您快速找到最适合自己需求的工具,从而做出更明智的投资决策。 十大币圈行情网站推荐 1. 币安 (Binance)  官网直达…

    2025年12月9日
    000
  • 一文搞清楚比特币(BTC)、以太坊(ETH)现在运行在”不同货币”宇宙中

    Binance币安 欧易OKX ️ Huobi火币️ 比特币正日益演变为一种以储值为核心功能的数字资产,而以太坊则持续强化其作为高效能链上效用平台的角色。分析机构指出,这一趋势正在催生新的结构性分化风险。 根据Glassnode与Keyrock联合发布的最新研究报告,比特币(BTC)和以太币(ETH…

    2025年12月9日 好文分享
    000
  • 华为手机下载欧易OKX官方APP详细安装教程

    Binance币安 欧易OKX ️ Huobi火币️ 在数字经济时代,安全可靠地进入数字货币世界至关重要。欧易OKX作为全球领先的数字资产服务平台,凭借其强大的功能和稳健的安全性备受全球用户信赖。对于华为手机用户而言,下载安装官方正版APP是开启数字之旅的第一步。本文将为您提供最安全、最详细的下载指…

    2025年12月9日 好文分享
    000
  • Solana怎么进行代币转账?Solana链上转账的详细操作流程

    使用钱 包、编程或批量工具可完成Solana链上代币转账。一、钱 包转账:打开Phantom等钱 包,选择SPL代币,输入接收地址与数量,确认交易并签名。二、JavaScript SDK转账:通过Web3.js和spl-token库,连接网络,加载私钥,获取ATA账户,构建并发送交易。三、批量工具转…

    2025年12月9日
    100
  • Cardano怎么进行智能合约查询?查询Cardano链上数据的工具与方法

    可通过区块链浏览器、API接口、编程库或命令行工具查询Cardano链上智能合约数据。1、使用Cardanoscan或Blockfrost浏览器输入脚本地址或交易哈希,查看合约UTXO及交易历史。2、通过Blockfrost API注册获取密钥,调用如/scripts/{script_hash}端点…

    2025年12月9日
    000
  • 比特币(BTC)前景如何?BTC币2025年、2026年-2030年价格预测

    比特币(btc)作为全球首个去中心化数字资产,自2009年诞生以来,其独特的魅力和颠覆性潜力一直备受关注。它不仅仅是一种新型的交易媒介,更代表着一种无需传统金融机构中介的信任机制。 在过去的十几年中,比特币经历了从无人问津到全球瞩目的蜕变,其价格波动剧烈,既有令人惊叹的暴涨,也有触目惊心的回调。理解…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信