- 1 child_process
- shell脚本">! /usr/bin/env node 如果作为可执行文件被excuFile调用,首行必须是这样
参考
shell脚本 - 2 cluster
参考:
https://github.com/ElemeFE/node-interview/blob/master/sections/zh-cn/process.md#child-process
node的单线程,以单一进程运行,因此无法利用多核CPU以及其他资源,为了调度多核CPU等资源,node还提供了child_process模块 和 cluster模块(v0.8之后)来支持多进程
1 child_process
提供给node随意创建子进程的能力,提供4个方法
方法 | 进程类型 | 执行类型 |
---|---|---|
spawn | 任意 | 命令 |
excu | 任意 | 命令 |
excuFile | 任意 | 可执行文件 |
focus | Node | js文件 |
// master.js
var cp = require('child_process');
cp.spawn("node", ["work.js"])
cp.exec("node worker.js", function (err, stdout, stderr) {
//code
})
cp.execFile("worker.js", function (err, stdout, stderr) {
//code
})
cp.fork("./worker.js")
//worker.js
// #! /usr/bin/env node 如果作为可执行文件被excuFile调用,必须保留本首行
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(Math.round((1 + Math.random()) * 1000), '127.0.0.1');
! /usr/bin/env node 如果作为可执行文件被excuFile调用,首行必须是这样
参考
shell脚本
1.1 进程间通信IPC(inner-process communication)
通过folk创建的node进程,会在父子进程间创建IPC通道,可以通过message和send传递消息
比如:
master.js
child.js
执行结果
1.2 句柄传递—实现多进程共同监听同一端口
参考:深入浅出nodejs —9.2.3
Node在版本v0.5.9引入了进程间发送句柄的功能。send()方法除了能通过IPC发送数据外,还能发送句柄,第二个可选参数就是句柄
//parent.js
var child = require('child_process').fork('child.js');
// Open up the server object and send the handle
var server = require('net').createServer();
server.on('connection', function (socket) {
socket.end('handled by parent\n');
});
server.listen(1337, function () {
child.send('server', server);
});
// child.js
process.on('message', function (m, server) {
if (m === 'server') {
server.on('connection', function (socket) {
socket.end('handled by child\n');
});
}
});
测试结果:
node parent.js
子进程和父进程都有可能处理我们客户端发起的请求。
1.3 进程事件
1.3.1 父进程监听子进程事件
1.3.1 进程监听信号事件
Node提供了这些信号对应的信号事件,每个进程都可以监听这些信号事件。这些信号事件是用来通知进程的,每个信号事件有不同的含义,进程在收到响应信号时,应当做出约定的行为
信号参考:
进程
有了父子进程之间的相关事件之后,就可以做一些自动重启等来保证服务的稳定性
2 cluster
官方示例
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end(`hello world + pid-->${process.pid}\n`);
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
启动 inspect模式
查看node进程