在Node.js中,可以利用cluster
模块开启多个进程,以此来充分地利用多核CPU的资源。cluster
模块可以创建一组Node.js进程,它们共享同一个服务器端口。
以下是一个使用cluster
模块的基本步骤:
- 导入
cluster
模块和其他必须的模块。 - 使用
cluster.isMaster
判断当前是否是主进程(Master)。 - 在主进程中,可以使用
cluster.fork()
来创建工作进程(Worker)。 - 在工作进程中,执行实际的应用代码,如HTTP服务器的监听等。
- 监听相应的事件来处理工作进程的启动、在线、退出等情况。
进程之间的通信可以通过以下方式:
- 主进程通过
worker.send()
发送消息到工作进程。 - 工作进程通过
process.send()
发送消息到主进程。 - 监听
message
事件来接收消息。
下面是一个创建多个工作进程并实现主工作进程通信的简单示例:
javascriptconst 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++) { const worker = cluster.fork(); // 主进程接收工作进程发送的消息 worker.on('message', (msg) => { console.log(`主进程收到消息 '${msg}' 来自工作进程 ${worker.process.pid}`); }); } cluster.on('exit', (worker, code, signal) => { console.log(`工作进程 ${worker.process.pid} 已退出`); }); } else { // 工作进程可以共享任何TCP连接。 // 在本例中,它是一个 HTTP 服务器。 http.createServer((req, res) => { res.writeHead(200); res.end('你好世界\n'); // 工作进程向主进程发送消息 process.send(`工作进程 ${process.pid} 收到请求`); }).listen(8000); console.log(`工作进程 ${process.pid} 已启动`); }
在这个例子中,主进程创建了和CPU核心数量相同的工作进程,并设置了接受消息的监听器。每当工作进程接收到HTTP请求时,它就会向主进程发送一个消息。主进程监听到消息后,在控制台中输出相关信息。
这种模式让Node.js应用可以在多核CPU上以更高效的方式运行,而且主工作进程之间的消息传递机制让它们可以交换信息。