Node多进程相关知识
2019-09-30 本文已影响0人
tracyXia
单个 Node.js 实例运行在单个线程中。 为了充分利用多核系统,有时需要启用一组 Node.js 进程去处理负载任务。
一、 Node 如何创建多进程
cluster 模块可以创建共享服务器端口的子进程。
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} 已启动`);
}
主进程不负责具体的业务处理,而是负责调度和管理工作进程,它是趋向于稳定的。而工作进程负责具体的业务处理。
二、组进程和工作进程间的通讯
父进程和子进程之间会创建IPC通道(通过IPC通道,父子进程之间才能通过message和send()传递消息)
if(cluster.isMaster){
// 主进程通知各工作进程不要执行写入
for (const id in cluster.workers) {
if (cluster.workers[id]) {
cluster.workers[id].send({ writeable: false });
}
}
}
/*如果为工作进程 */
if(cluster.isWorker){
process.on('message', (msg) => {
if (msg.writable) {
this.reload();
} else {
this.stream = null;
}
});
}
三、cluster集群
1.worker对象
Worker 对象包含了关于工作进程的所有的公共的信息和方法。在主进程中,可以使用 cluster.workers 来获取它。 在工作进程中,可以使用 cluster.worker 来获取它。
2. message事件
在工作进程内,可以使用 process.on('message')
3.send方法
发送一个消息给工作进程或主进程,也可以附带发送一个句柄。
在主进程中
if(cluster.isMaster){
// 主进程通知各工作进程不要执行写入
for (const id in cluster.workers) {
if (cluster.workers[id]) {
cluster.workers[id].send({ writeable: false });
}
}
}
在工作进程中,使用process.send()
四、process对象
process 对象是一个全局变量,它提供有关当前 Node.js 进程的信息并对其进行控制。 作为一个全局变量,它始终可供 Node.js 应用程序使用,无需使用 require()。
1. message事件
如果使用 IPC 通道衍生 Node.js 进程(参阅子进程和集群文档),则只要子进程收到父进程使用 childprocess.send()
发送的消息,就会触发 'message'
事件。
2.process.cwd()
process.cwd() 方法返回 Node.js 进程的当前工作目录。
3.process.pid
process.pid 属性返回进程的 PID。