探究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核心来提高应用程序的性能。