node 单线程、多线程和多进程模型

news2024/12/24 21:08:17

文章目录

  • node 启动过程
  • 单线程
  • 多线程
    • node 启动过程相关线程
    • node 多线程特点
    • 创建多线程
  • 多进程
    • 创建多进程
    • cluster
    • 进程守护

node 启动过程

  • C++ 层引导:Node.js 启动时,会初始化 C++ 层的结构和依赖项,如 V8 引擎、Libuv 事件循环、核心模块等。此外,在这个阶段中,Node.js 也会解析命令行参数、环境变量,并初始化内存和全局对象
  • V8 引擎初始化:Node.js 依赖于 V8 引擎来执行 JavaScript 代码。在启动过程中,Node.js 需要配置 V8 引擎并完成相应初始化。此外,Node.js 还会在这个阶段对 V8 引擎进行微调和优化,以获得更好的性能和运行效果。
  • 内置模块加载:Node.js 内置了许多基本模块,如文件系统(fs)、网络(http)、事件(events)等。此外,Node.js 还会加载特定于平台的模块,例如 Windows、macOS 和 Linux 系统上各自的特定模块
  • 执行入口文件
  • 事件循环启动:所有初始化工作完成后,Node.js 将启动 Libuv 事件循环。

单线程

  • node 虽然是单线程模型,但是其基于事件驱动、异步非阻塞 I/O 模型,可以应用于高并发场景,避免了线程创建、线程之间上下文切换所产生的资源开销
  • 但当项目中需要有大量计算 CPU 密集型的操作时,单线程模型就会被阻塞

多线程

node 启动过程相关线程

  • node 单线程的指的是 JavaScript 的执行是单线程的,启动时会开启7个线程
  • node 中最核心的是 v8 引擎,在 Node 启动后,会创建 v8 的实例,这个实例是多线程的。
    • 主线程:编译、执行代码。

    • 编译/优化线程:在主线程执行的时候,可以优化代码。

    • 分析器线程:记录分析代码运行时间,为 Crankshaft 优化代码执行提供依据。node 有两个编译器,full-codegen:简单快地将 js 编译成简单但是很慢的机械码;Crankshaft:比较复杂的实时优化编译器,编译高性能的可执行代码。

    • 垃圾回收的几个线程。

    • 有一些 IO 操作(DNS,FS)和一些 CPU 密集计算(Zlib,Crypto)会启用 node 的线程池,从而将线程增加到11个(线程池默认大小为 4)

// 更改线程池默认大小
process.env.UV_THREADPOOL_SIZE = 12

node 多线程特点

  • 每个线程都有单独的 V8 引擎
  • ArrayBuffers 可以将内存中的变量从一个线程转到另外一个
  • SharedArrayBuffer 可以在多个线程中共享内存中的变量,但是限制为二进制格式的数据。

创建多线程

worker

多进程

创建多进程

child_process.spawn():适用于返回大量数据,例如图像处理,二进制数据处理。
child_process.exec():适用于小量数据,maxBuffer 默认值为 200 * 1024 超出这个默认值将会导致程序崩溃,数据量过大可采用 spawn。
child_process.execFile():类似 child_process.exec(),区别是不能通过 shell 来执行,不支持像 I/O 重定向和文件查找这样的行为
child_process.fork(): 衍生新的进程,进程之间是相互独立的,每个进程都有自己的 V8 实例、内存,系统资源是有限的,不建议衍生太多的子进程出来,通长根据系统** CPU 核心数**设置。

cluster

在这里插入图片描述

  • 实现原理
    • cluster模块调用fork方法来创建子进程,该方法与child_process中的fork是同一个方法。
  • 主从模型
    • cluster 模块采用的是经典的主从模型,cluster会创建一个master,然后根据你指定的数量复制出多个子进程,可以使用 cluster.isMaster 属性判断当前进程是 master 还是 worker (工作进程)。
    • 由 master 进程来管理所有的子进程,主进程不负责具体的任务处理,主要工作是负责调度和管理。
    • cluster 模块使用内置的负载均衡来更好地处理线程之间的压力,该负载均衡使用了 Round-robin 算法(也被称之为循环算法)。当使用 Round-robin 调度策略时,master accepts() 所有传入的连接请求,然后将相应的 TCP 请求处理发送给选中的工作进程(该方式仍然通过IPC来进行通信)
      • master 进程内部启动了一个 TCP 服务器,而真正监听端口的只有这个服务器,当来自前端的请求触发服务器的 connection 事件后,master 会将对应的 socket 句柄发送给子进程。
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主进程 ${process.pid} 正在运行`);
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 已退出`);
  });
} else {
  // 工作进程可以共享任何 TCP 连接。
  // 在本例子中,共享的是 HTTP 服务器。
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello World');
  }).listen(8000);
  console.log(`工作进程 ${process.pid} 已启动`);
}

进程守护

  • 当服务意外崩溃了是不能自动重启进程的,所以需要通过某些方式来守护这个开启的进程
  • 第三方的进程守护框架,pm2 和 forever ,它们都可以实现进程守护,底层也都是通过 child_process 模块和 cluster 模块实现的

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

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

相关文章

TCP/IP 协议详解

文章目录 简介应用层传输层网络层网络接口层数据包发送过程TCP 三次握手四次挥手三次握手为什么是三次握手四次挥手为什么是四次挥手 简介 TCP/IP传输协议&#xff0c;即传输控制/网络协议&#xff0c;也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。 TCP/IP传输…

【Nginx基础与应用】

文章目录 Nginx基础与应用1 Nginx 概述1.1 介绍1.2 下载与安装1.3 目录结构 2 Nginx 命令3 Nginx 配置文件结构4 Nginx 具体应用4.1 部署静态资源4.2 反向代理4.3 负载均衡(基于反向代理实现) Nginx基础与应用 1 Nginx 概述 1.1 介绍 Nginx是一款轻量级的web服务器/反向代理…

如何在 Linux 中安装、设置和使用 SNMP?

概要 SNMP&#xff08;Simple Network Management Protocol&#xff09;是一种用于管理和监控网络设备的协议。它允许网络管理员通过远程方式收集设备的运行状态、性能数据和错误信息&#xff0c;以便进行故障排除和网络优化。在Linux系统中&#xff0c;我们可以安装、设置和使…

vue3-element-admin 项目说明文档

vue3-element-admin官方文档 | 在线预览 项目介绍 vue3-element-admin 是基于 Vue3 Vite4 TypeScript5 Element-Plus Pinia 等最新主流技术栈构建的后台管理前端模板&#xff08;配套后端源码&#xff09;。 项目有以下特性&#xff1a; 基于 vue-element-admin 升级到…

共建信创安全生态|安全狗正式加入麒麟软件安全生态联盟

5月25日&#xff0c;麒麟软件安全生态联盟第二次工作会议顺利举办。 作为国内云原生安全领导厂商&#xff0c;安全狗以安全生态联盟成员单位应邀参会并发表重要观点。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;成立于2013年&#xff0c;致力于…

无向图G的邻接矩阵法和邻接表法以及遍历输出无向图G包括两种存储的FirstNeighbor和NextNeighbor两种基本操作

一.邻接矩阵法 将下列图G用邻接矩阵法进行存储 圆圈中的字符&#xff1a;是顶点的值 圆圈旁边的数字&#xff1a;是顶点的序号 边线上的值&#xff1a;是两个顶点之间的权值 1.结构体 #define MaxVertexNum 10 typedef char VerTexType;//顶点的数据类型 typedef int Edg…

prometheus + grafana + node_exporter + alertmanager 的安装部署与邮件报警

背景介绍 Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发&#xff0c;是Google BorgMon监控系统的开源版本。 Prometheus的特点 多维度数据模型。 灵活的查询语言。 不依赖分布式存储&#xff0c;单个服务器节点是自主的。 通…

二值化的mask生成yolov5-7.0的实例分割训练标签

背景&#xff1a;要用yolov5-7.0训练分割&#xff0c;这里使用自己的数据&#xff0c;mask是二值化的数据&#xff0c;要先转换成COCO格式&#xff0c;这里用imantics实现。 详见&#xff1a;https://zhuanlan.zhihu.com/p/427096258 截取部分代码如下图&#xff0c;读取image图…

C++之引用、指针引用、常引用

引用 引用的概念引用的定义引用的使用引用的应用引用的本质&#xff08;就是C内部的一个常指针(type * const 名)&#xff09;指针引用&#xff08;其类型还是指针type *&#xff09;常引用&#xff08;采用const修饰的引用&#xff09; 引用的概念 1、通常我们说的引用指的是…

和鲸社区数据分析每周挑战【第九十五期:奈飞股价预测分析】

和鲸社区数据分析每周挑战【第九十五期&#xff1a;奈飞股价预测分析】 文章目录 和鲸社区数据分析每周挑战【第九十五期&#xff1a;奈飞股价预测分析】一、前言1、背景描述2、数据说明3、数据集预览 二、数据读取和数据预处理三、历史股价数据可视化四、利用sklearn中LinearR…

Linux 系统下的df、du、fdisk、lsblk指令

文章目录 1 查看磁盘与目录容量&#xff08;df、du&#xff09;2 查看磁盘分区&#xff08;fdisk、lsblk&#xff09;3 df、du、fdisk、lsblk的区别 1 查看磁盘与目录容量&#xff08;df、du&#xff09; df -h //列出文件系统的整体磁盘使用量在显示的结果中要特别留意根目录…

安洵杯2023 部分pwn复现

1. harde_pwn 漏洞点&#xff1a; 覆盖printf的返回地址 from pwn import * from LibcSearcher import LibcSearcher from sys import argv from Crypto.Util.number import bytes_to_long import os def ret2libc(leak, func, path):if path :libc LibcSearcher(func, leak…

二级Python考试环境安装教程

二级Python考试环境 Python3.5.3至Python3.9.10版。为方便考生学习与考点备考&#xff0c;现提供二级Python应用软件的网络下载&#xff0c;广大考生和考点管理员可以下载使用 软件包下载&#xff08;62.18 MB&#xff09; https://www.123pan.com/s/y4HrVv-0S0lA.html 安装…

在windows11环境下安装CUDA11.6+Anaconda3+pyToach1.13搭建炼丹炉

0.电脑环境 系统&#xff1a;win11 显卡&#xff1a;NVIDIA GTX1650 还有一个pyCharm&#xff0c;其他也用不到了&#xff0c;需要的文章中会进行说明 1.安装CUDA11.6 目前2023.03出来的pyToach2.0是用不到了&#xff0c;因为最低版本支持CUDA11.7。我的显卡是1650&#xff0c…

leetcode数据库题第八弹(免费题刷完了)

leetcode数据库题第八弹&#xff08;免费题刷完了&#xff09; 1757. 可回收且低脂的产品1789. 员工的直属部门1795. 每个产品在不同商店的价格1873. 计算特殊奖金1890. 2020年最后一次登录1907. 按分类统计薪水1934. 确认率1965. 丢失信息的雇员1978. 上级经理已离职的公司员工…

WebRTC音视频会议底层支撑技术

WebRTC允许应用使用P2P通信。WebRTC是一个广泛的话题&#xff0c;在本文中&#xff0c;我们将重点讨以下问题。 为什么Web RTC 如此受欢迎&#xff1f; 在P2P连接过程中会发生什么 信号传递 NATs和ICE STUN & TURN服务器 VP9视频编解码器 WebRTC APIs 安全 1.为什…

科技资讯|苹果新专利曝光:手势增强用户的交互体验

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的最新清单&#xff0c;苹果公司获得了一项编号为 US 20230195237 A1 的专利&#xff0c;展示了使用手势导航用户界面的交互体验。 苹果这项专利涉及 iPhone、iPad、Apple Watch 和 Mac&#xff0c;使用屏幕生成组件和…

Typora的安装和授权(2023)

文章目录 1. 文章引言2. Typora的下载3. Typora的安装4. Typora的授权 1. 文章引言 我们在开发的过程中&#xff0c;不可或缺地要使用到markdown文本&#xff0c;支持markdown文本的编辑器有很多&#xff0c;其中Typora便是一款不错的编辑器。 不过&#xff0c;Typora是收费的…

知行之桥EDI系统QA第二期:AS2专题

随着使用知行之桥EDI系统的用户群体日益壮大&#xff0c;在使用过程中&#xff0c;用户可能对系统的工作原理、功能模块和实施过程有一些疑问。近期整理了有关 AS2 的四个常见问题&#xff1a; 1.知行之桥 EDI系统支持AS2 协议的 AES_GCM 算法吗&#xff1f;2.AS2发送文件后收…

C++不知算法系列之计数排序算法的计数之巧

1. 前言 计数排序是较简单的排序算法&#xff0c;其基本思想是利用数组索引号有序的原理。 如对如下的原始数组中的数据(元素)排序&#xff1a; //原始数组 int nums[5]{9,1,7,6,8};使用计数排序的基本思路如下&#xff1a; 创建一个排序数组。数组的大小由原始数组的最大值…