Node多进程相关知识

单个 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。

你可能感兴趣的:(Node多进程相关知识)