node.js多进程

简介: node.js多进程

spawn



创建子进程


// [0,1,2]相当于[process.stdin, process.stdout, process.stderr]
const parent = spawn("node", ["child.js"], {
    cwd: path.resolve(__dirname, './child'),
    stdio: [0, 1, 2, "ipc"]
})


进程通信方式 ipc/pipe


pipe流的方式


stdio:["pipe","pipe","pipe"]


// child.js
process.stdout.write("子进程以流的方式输出"+fib(40))
process.stdout.on("data", (data) => {
     console.log("子进程收到父进程的数据"+ data.toString());
})


// parent.js
// 收到子进程消息
parent.stdout.on("data", (data) => {
    console.log("父进程监听子进程的输出"+ data.toString());
})
// 给子进程发送消息
parent.stdout.write("父进程发送数据");


ipc通信


stdio:[0,1,2,"ipc"]
// child.js
process.on("message",(data) => {
    console.log(data)
})
process.send(obj)


// parent.js
parent.on("message",(data) => {
    console.log(data)
})
parent.send(obj)


ipc通信和pipe通信的区别


fork



创建子进程


fork默认调用的是node执行的命令,默认采用ipc的通信方法


const parent = spawn("child.js", {
    cwd: path.resolve(__dirname, './child'),
})


当我们关闭父进程的时候,父进程创建的子进程也会随着关闭,那我们怎么创建一个独立的子进程呢


const parent = spawn("node", ["child.js"], {
    cwd: path.resolve(__dirname, './child'),
    stdio: ignore,
    detached:true,
})
parent.unref()// 独立子进程


execFile



execFile支持多种启动方式

execFile可以设置timeout超时时间,一旦创建的进程运行超过设定的时间将会被杀死

我们可以看到execFile中有一个maxBuffer,因为stdout会先做一个汇总,再传到这个回调函数里面,可能会存在内存溢出,所以会限制一个maxBuffer


image.png


execFile("tec360", ['-datafile', url], (err, stdout, stderr) => {
    if (err) {
        // console.log('res on err',err)
        reject({msg:err,code:PROCESS_CODE.ERROR})
    } else if (stderr) {
        // console.log('std err', stderr)
        reject({msg:stderr,code:PROCESS_CODE.ERROR})
    }
})


输出ls -ll命令结果


const parent = execFile("ls",["-ll"],{
    cwd:path.resolve(__diname,"./")
},(err,stdout,stderr) => {
    console.log(stdout)
})

exec



用的比较少,但是可以打印命令行中的环境变量

可以设置timeout超时时间,一旦创建的进程运行超过设定的时间将会被杀死


const parent = exec("echo $PATH",{
    cwd:path.resolve(__dirname,"./")
})

集群cluster



父进程传递给子进程服务的方式,共同监听同一个端口


// 主进程
const http = require("http")
const { fork } = require('child_process')
const path = require('path');
const cpus = require("os").cpus()
const server = http.createServer((req,res)=>{
    res.end("master"+"\n");
}).listen(3000)
for(let i = 0; i < cpus.length - 1; i++) {
    const cp = fork("server.js",{
        cwd:path.resolve(__dirname,'.')
    });
    cp.send("server",server);
}
// server.js
const http = require("http")
// 如果子进程直接监听3000端口,会报错,因为父进程已经占用了3000端口
// const server = http.createServer((req,res) => {
//     res.end(process.id + "\n");
// }).listen(3000);
process.on('message',(msg,server) => {
    http.createServer((req,res) => {
        res.end('child process' + "\n" + process.pid, + "\n");
    }).listen(server)
})


Cluster事件


const cluster = require('cluster')
const http = require("http")
const { resolve } = require("path")
const cpus = require("os").cpus()
// 第一种,判断是主进程还是工作进程的方式
// if(cluster.isMaster){
//     cpus.forEach(() =>{
//         cluster.fork();
//     })
// }else {
//     http.createServer((req,res) => {
//         res.end("child procecss" + '\n'+process.pid+"\n")
//     }).listen(3000)
// }
// 第二种使用cluster.setupMaster()这个Api,在node16中应换成setupPrimary
cluster.setupMaster({
    exec:resolve(__dirname,"./server.js"),
})
for(let i = 0; i < cpus.length; i++) {
    cluster.fork()
}
// 守护进程
cluster.on("exit",(worker,code,signal) => {
    console.log('worker died');
    cluster.fork();
})



目录
相关文章
|
2月前
|
缓存 JavaScript Unix
Node.js 多进程
10月更文挑战第8天
38 0
|
1月前
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
54 4
|
4月前
|
JavaScript Windows
NodeJs——如何获取Windows电脑指定应用进程信息
NodeJs——如何获取Windows电脑指定应用进程信息
131 0
|
4月前
|
JavaScript 前端开发
nodejs process进程
nodejs process进程
41 0
|
6月前
|
JavaScript 前端开发 Shell
深入Node.js的进程与子进程:从文档到实践
深入Node.js的进程与子进程:从文档到实践
|
6月前
|
缓存 JavaScript Unix
Node.js 多进程
Node.js 多进程
42 0
|
7月前
|
消息中间件 监控 JavaScript
Node.js中的进程管理:child_process模块与进程管理
【4月更文挑战第30天】Node.js的`child_process`模块用于创建子进程,支持执行系统命令、运行脚本和进程间通信。主要方法包括:`exec`(执行命令,适合简单任务)、`execFile`(安全执行文件)、`spawn`(实时通信,处理大量数据)和`fork`(创建Node.js子进程,支持IPC)。有效的进程管理策略涉及限制并发进程、处理错误和退出事件、使用流通信、谨慎使用IPC以及监控和日志记录,以确保应用的稳定性和性能。
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
192 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
4月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。