美文网首页
Node多进程相关知识

Node多进程相关知识

作者: tracyXia | 来源:发表于2019-09-30 10:49 被阅读0次

    单个 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多进程相关知识

          本文链接:https://www.haomeiwen.com/subject/gecqpctx.html