说说nodejs中进程通信有哪些方式
# 是什么
nodejs是单进程单线程,js引擎在主线程上运行,异步事件通过libuv库通过事件循环实现线程调度
# 怎么用
通过child_process模块来实现子进程,有4种方式
- exec 返回回调,可以执行shell
- execFile 返回回调
- spawn 返回流
- fork 返回流 (node应用,其他均为非node应用)
# exec 直接执行shell
let cp = require("child_process");
cp.exec("echo hello world", function(err, stdout) {
console.log(stdout); // hello world
});
# execFile 执行参数
let cp = require("child_process");
cp.execFile("echo", ["hello", "world"], function(err, stdout) {
console.log(stdout); // hello world
});
# spawn
let cp = require("child_process");
var spawnObj = cp.spawn('ping', ['127.0.0.1'], {encoding: 'utf-8'});
spawnObj.stdout.on('data', function(chunk) {
console.log(chunk.toString());
});
# fork
let child = cp.fork(__dirname+'/child.js')
child.on('message', function(msg){
console.log('收到了子进程消息:', msg)
child.disconnect()
})
child.send('hello world');
// child.js
process.on('message', function(msg){
console.log('收到父进程消息, 处理中',msg)
process.send('处理完成, 我来自child')
})
# cluster
意为集成,集成了fork方式及根据cpu多核创建的子进程,自动控制负载均衡的方式
- master: 主进程
- worker: 工作进程
- 目的就是要利用多核,多一个进程处理
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('你好世界\n');
}).listen(8000);
console.log(`工作进程 ${process.pid} 已启动`);
}
# FAQ
上次更新: 2021/12/19, 18:05:42