Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nodejs子进程

Nodejs子进程

作者头像
epoos
发布于 2022-06-06 08:19:26
发布于 2022-06-06 08:19:26
1.4K00
代码可运行
举报
文章被收录于专栏:epoos.comepoos.com
运行总次数:0
代码可运行

进程是CPU分配资源的最小单位,分配独立内存,进程之间可通信,但是必须通过内核,使用IPC接口来做,代价比较大 线程是CPU调度的最小单位

javascript 语言本身被发明出来就是为浏览器服务的,所以为了在浏览器端渲染的界面的时候不会被来自不同金IC的数据干扰,js执行环境被设计成了单进程执行。 但是在作为Nodejs使用的时候,为了最大发挥服务器的多核优势,Nodejs也被安排了多进程的能力。而为其提供多进程能力的核心模块就是 child_process child_process提供了衍生子进程的能力,主要由child_process.spawn()函数提供。 默认情况下, stdin、 stdout 和 stderr 的管道会在父 Node.js 进程和衍生的子进程之间建立,这些管道的容量是有限的。

child_process.spawn

nodejs还提供了一些基于child_process.spawn的一些替代方法,都是基于 child_process.spawn() 或 child_process.spawnSync() 实现的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
child_process.exec(): 衍生 shell 并且在 shell 中运行命令,当完成时则将 stdout 和 stderr 传给回调函数。
child_process.execFile(): 类似于 child_process.exec(),但是默认情况下它会直接衍生命令而不先衍生 shell。
child_process.fork(): 衍生新的 Node.js 进程,并调用指定的模块,该模块已建立了 IPC 通信通道,可以在父进程与子进程之间发送消息。
child_process.execSync(): child_process.exec() 的同步版本,会阻塞 Node.js 事件循环。
child_process.execFileSync(): child_process.execFile() 的同步版本,会阻塞 Node.js 事件循环。
cluster

cluster模块是基于child_process.fork方法创建的,它可以使用IPC和父进程进行通信。

cluster 模块可以创建共享服务器端口的子进程,因此常常被用作nodejs的多进程部署,pm2的cluster模式就是利用了此方法。 1.利用cluster创建子进程的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const cluster = require('cluster')
const http = require('http')
const numsCPUS = require('os').cpus().length
if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`)
  for( let i = 0; i < numsCPUS.length; i++) {
    cluster.fork() // fork出来的子进程拥有和父进程一致的、独立的资源(数据空间、堆、栈)等。
  }
  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`)
    cluster.fork() // 重新fork子进程
  })
} else { // 业务逻辑代码
  http.createServer((req, res) => {
    res.writeHead(200)
    res.end('hello world\n')
  }).listen(8000)
  console.log(`worker ${process.pid} started`)
}

2.cluster实现原理 cluster其实就是对于child_process模块的封装,通过child_procress.fork()出子进程,同时基于IPC实现了与master进程之间的通信。 master进程创建一个socket,并绑定监听到该目标端口,通过与子进程之间建立IPC通道,调用子进程的send方法,将socket(链接句柄)传递给子进程,大致实现如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// master.js
const { fork } = require('child_process')
const cpus = require('os').cpus()
const net = require('net')
const workers = []
for (let i = 0; i < cpus.length; i++) {
  workers.push(fork('./worker.js'))
}

const handle = net._createServerHandle('0.0.0.0', 8000) // 其实这个handle就是我们的业务逻辑(app.js)
handle.listen()

handle.on('connection', (err, handle) => {
  const worker = workers.pop()
  worker.send({}, handle)
  workers.unshift(worker)
})

子进程的接收到来自主进程的消息以及句柄之后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// worker.js
const net = require('net')
process.on('message', (message, handle) => {
  const socket = new net.socket({ handle })
  socket.readable = true
  socket.writable = true
  socket.end(['data', message])
})

相关链接

Nodejs cluster模块深入探究 Nodejs 进阶:解答 Cluster 模块的几个疑问 pm2的cluster模式与fork模式的区别 浏览器进程与线程梳理 cluster子进程重启方案 cluster 模块的实现原理

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅析 NodeJS 多进程和集群
NodeJS 提供了 child_process 模块,并且提供了 child_process.fork() 函数供我们复制进程。
winty
2021/07/01
9980
浅析 NodeJS 多进程和集群
Node.js中的进程与线程
1. 回顾进程和线程的定义 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 2. Node.js的单线程 Node特点主线程是单线程的 一个进程只开一个主线程,基于事件驱动的、异步非阻塞I/O,可以应用于高并发场景。 Nodejs中没有多线程,为了充分利用多核cpu,可以使用子进程实现内核的负载均衡,那我们就要解决以下问题: Node.js 做耗
用户1097444
2022/06/29
1.3K0
Node.js中的进程与线程
Nodejs进阶:如何玩转子进程(child_process)
本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 模块概览 在node中,child_process这个模块非常重要。掌握了它,等于在node的世界开启了一扇新的大
IMWeb前端团队
2018/01/08
4.4K0
Nodejs进阶:如何玩转子进程(child_process)
在node中,child_process这个模块非常重要。掌握了它,等于在node的世界开启了一扇新的大门。熟悉shell脚本的同学,可以用它来完成很多有意思的事情,比如文件压缩、增量部署等,感兴趣的同学,看文本文后可以尝试下。
IMWeb前端团队
2019/12/05
3.4K0
理解NodeJS多进程
一次面试中,我提到自己用过pm2,面试接着问:「那你知道pm2父子进程通信方式吗」。我大概听说pm2有cluster模式,但不清楚父子进程如何通信。面试结束后把NodeJS的多进程重新整理了一下。
coder2028
2022/10/10
1.2K0
深入了解 Node 的多进程服务
我们现在已经知道了Node是单线程运行的,这表示潜在的错误有可能导致线程崩溃,然后进程也会随着退出,无法做到企业追求的稳定性;另一方面,单进程也无法充分多核CPU,这是对硬件本身的浪费。Node社区本身也意识到了这一问题,于是从0.1版本就提供了child_process模块,用来提供多进程的支持。
用户8921923
2022/10/24
7910
深入理解Node.js 进程与线程(8000长文彻底搞懂)
进程与 线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少。本篇文章除了介绍概念,通过Node.js 的角度讲解 进程与 线程,并且讲解一些在项目中的实战的应用,让你不仅能迎战面试官还可以在实战中完美应用。
coder_koala
2019/08/08
2.6K0
深入理解Node.js 进程与线程(8000长文彻底搞懂)
在nodejs中创建child process
nodejs的main event loop是单线程的,nodejs本身也维护着Worker Pool用来处理一些耗时的操作,我们还可以通过使用nodejs提供的worker_threads来手动创建新的线程来执行自己的任务。
程序那些事
2021/01/28
3.9K0
Node.js进阶之进程与线程
进程与线程在服务端研发中是一个非常重要的概念,如果您在学习的时候对这一块感到混乱或者不是太理解,可以阅读下本篇内容,本篇在介绍进程和线程的概念之外,列举了很多 Demo 希望能从实战角度帮助您更好的去理解。
五月君
2019/07/12
1.2K0
Node.js进阶之进程与线程
Nodejs 进阶:解答 Cluster 模块的几个疑问
?在 PM2 的配置文件中可以设置 exec_model:'cluster' 和 instances 两个属性来设置开启多个进程,PM2 其实主要也是利用 Nodejs Cluster 这个模块来实现了,还有 Egg.js 中的 egg-cluster 模块在启动 Worker 进程时也是使用的 Nodejs Cluster 模块。下面来了解下 Nodejs Cluster 这个模块做了什么?
五月君
2020/03/18
2.1K0
Nodejs 进阶:解答 Cluster 模块的几个疑问
分享 10 道 Nodejs 进程相关面试题
关于线程和进程是服务端一个很基础的概念,在文章 Node.js进阶之进程与线程 中介绍了进程与线程的概念之后又给出了在 Node.js 中的进程和线程的实际应用,对于这块不是很理解的建议先看下。
五月君
2019/07/12
1.1K0
分享 10 道 Nodejs 进程相关面试题
在nodejs中创建cluster
在前面的文章中,我们讲到了可以通过worker_threads来创建新的线程,可以使用child_process来创建新的子进程。本文将会介绍如何创建nodejs的集群cluster。
程序那些事
2021/01/28
3.7K0
分享 10 道 Nodejs 进程相关面试题
关于线程和进程是服务端一个很基础的概念,在文章 Node.js进阶之进程与线程 中介绍了进程与线程的概念之后又给出了在 Node.js 中的进程和线程的实际应用,对于这块不是很理解的建议先看下。
胡哥有话说
2019/08/29
1.3K0
分享 10 道 Nodejs 进程相关面试题
Nodejs进程间通信
一.场景 Node运行在单线程下,但这并不意味着无法利用多核/多机下多进程的优势 事实上,Node最初从设计上就考虑了分布式网络场景: Node is a single-threaded, single-process system which enforces shared-nothing design with OS process boundaries. It has rather good libraries for networking. I believe this to be a basis
ayqy贾杰
2019/06/12
3.2K0
简单分析下 Node.js 关于集群的那些事
nodejs 原有版本中没有实现多线程,为了充分利用多核 cpu,可以使用子进程实现内核的负载均衡。
coder_koala
2020/11/19
6590
【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)
cluster模块是node.js中用于实现和管理多进程的模块。常规的node.js应用程序是单线程单进程的,这也意味着它很难充分利用服务器多核CPU的性能,而cluster模块就是为了解决这个 问题的,它使得node.js程序可以以多个实例并存的方式运行在不同的进程中,以求更大地榨取服务器的性能。node.js在官方示例代码中使用worker实例来表示主进程fork出的子进程,使得前端开发者在学习过程中非常容易和浏览器环境中的worker实现的多线程混淆。为了容易区分,我们和node官方文档使用一致的名称,用集群中的master和worker来区分主进程和工作进程,用worker_threads来描述工作线程。
大史不说话
2019/06/02
1.1K0
Node.js 中 child_procss 模块
Node.js 的单线程模型给了它无数的赞美,也带给它无数的诟病。单线程模型,让开发者远离了线程调度的复杂性,使用事件驱动也能开发出一个高并发的服务器;同样也是因为单线程,让CPU密集型计算应用完全不适用。
李振
2021/11/26
7290
系列3|走进Node.js之多进程模型
文:正龙(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 之前的文章“走进Node.js之HTTP实现分析”中,大家已经了解 Node.js 是如何处理 HTTP 请求的,在整个处理过程,它仅仅用到单进程模型。那么如何让 Web 应用扩展到多进程模型,以便充分利用CPU资源呢?答案就是 Cluster。本篇文章将带着大家一起分析Node.js的多进程模型。 首先,来一段经典的 Node.js 主从服务模型代码: const cluster = require('cluster'); cons
iKcamp
2018/03/30
1.4K0
系列3|走进Node.js之多进程模型
node进程间通信
作为一名合格的程序猿/媛,对于进程、线程还是有必要了解一点的,本文将从下面几个方向进行梳理,尽量做到知其然并知其所以然:
用户8200753
2023/10/22
2920
《深入浅出Node.js》-玩转进程
Node 基于 V8 引擎构建,采用单线程模型,所有的 JavaScript 将会运行在单个进程的单个线程上,它带来的好处是:没有多线程中常见的锁以及线程同步的问题,操作系统在调度时也能减少上下文切换,提高 CPU 使用率。但是如今 CPU 基本均是多核的,真正的服务器往往还有多个 CPU,一个 Node 进程只能利用一个核,这带来硬件资源的浪费。另外,Node 运行在单线程之上,一个单线程抛出异常而没有被捕获,将会导致进程的崩溃。
李振
2021/11/26
8130
《深入浅出Node.js》-玩转进程
相关推荐
浅析 NodeJS 多进程和集群
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验