c语言编程笔录

首页 >   > 笔记大全

笔记大全

探究Node中的的进程与子进程

更新时间:2023-12-03

探究Node中的进程与子进程

Node.js基于事件驱动和非阻塞I/O的特性,可以在单线程下实现高并发。但是,这并不意味着Node.js只能在单线程下运行。在一些需要处理更多计算的应用中,使用多线程是十分必要的。Node中的进程与子进程就是实现多线程的一种方式。

进程模块

在Node中,可以通过进程模块(process)来创建新的进程。process模块是一个全局对象,在Node.js的任何地方都可以直接使用。

  const { spawn }=require('child_process');
  const ls=spawn('ls', ['-lh', '/usr']);

  ls.stdout.on('data', (data)=> {
    console.log(`stdout: ${data}`);
  });

  ls.stderr.on('data', (data)=> {
    console.error(`stderr: ${data}`);
  });

  ls.on('close', (code)=> {
    console.log(`child process exited with code ${code}`);
  });
  

以上代码首先使用spawn()方法创建了一个新进程ls,并向其传入参数。然后监听它的stdout、stderr和close事件。当标准输出有数据流入时,会打印stdout信息。当标准错误有数据流入时,会打印stderr信息。当进程退出时,会执行close事件的回调函数。

子进程模块

进程模块虽然可以创建新的进程,但是在某些场景下,我们需要在主进程中控制子进程的执行。Node.js提供了子进程模块(child_process)来满足这些需求。

  const { exec }=require('child_process');

  exec('ls /usr', (error, stdout, stderr)=> {
    if (error) {
      console.error(`exec error: ${error}`);
      return;
    }
    console.log(`stdout: ${stdout}`);
    console.error(`stderr: ${stderr}`);
  });
  

以上代码通过exec()方法创建了一个子进程,执行了'ls /usr'命令,并分别输出了标准输出和标准错误的信息。

集群模块

集群模块(cluster)是Node中的一个核心模块,它允许利用多个CPU核心来提高应用程序的性能和稳定性。

  const cluster=require('cluster');
  const http=require('http');
  const numCPUs=require('os').cpus().length;

  if (cluster.isMaster) {
    console.log(`Master ${process.pid} is running`);

    for (let i=0; i < numCPUs; i++) {
      cluster.fork();
    }

    cluster.on('exit', (worker, code, signal)=> {
      console.log(`worker ${worker.process.pid} died`);
    });
  } else {
    http.createServer((req, res)=> {
      res.writeHead(200);
      res.end('hello world\n');
    }).listen(8000);

    console.log(`Worker ${process.pid} started`);
  }
  

以上代码首先判断当前进程是否为主进程,如果是则遍历CPU核心数,通过cluster.fork()方法来创建子进程。当其中一个子进程退出时,会执行exit事件的回调函数。如果当前进程不是主进程,则启动一个http服务器,并输出Worker进程号。

总结

Node中的进程与子进程是多线程实现的一种方式,可以提高应用程序的性能和稳定性。进程模块(process)可以创建新的进程;子进程模块(child_process)可以在主进程中控制子进程的执行;集群模块(cluster)可以利用多个CPU核心来提高应用程序的性能。