Node.js 是单线程的,但是它支持使用多进程来提高性能。当我们的应用程序需要高性能时,我们可以使用多进程来提高应用程序的性能。
Node.js 提供了 cluster 模块来实现多进程。cluster 模块可以让我们将一个 Node.js 应用程序分配到多个 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`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
这段代码会创建和 CPU 核心数量相同的 worker 进程,并在每个进程上运行 HTTP 服务器。当一个 worker 进程退出时,主
进程会自动重新启动一个新的 worker 进程来保证总进程数量不变。
除了 cluster 模块,还可以使用 process 模块来在应用程序内部创建新的进程。process 模块提供了 spawn() 方法来创建新的进程。
下面是一个使用 spawn() 方法创建新进程的示例
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.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
这段代码会创建一个新进程来执行 'ls' 命令,并将输出重定向到父进程的 stdout 和 stderr 上。
使用多进程可以帮助我们提高应用程序的性能,特别是在处理高负载的情况下,多进程可以更好的利用多核 CPU 的性能。但是,在使用多进程时,需要注意进程间通信的问题,因为每个进程都有自己的内存空间。如果需要在进程间共享数据,需要使用进程间通信机制,如 IPC。
总之,在 Node.js 中使用多进程可以提高应用程序的性能。