在Node.js中如何进行进程间通信?
- 使用 child_process 模块 Node.js 提供了 child_process 模块,可以用来创建子进程,并且这些子进程可以与父进程进行通信。 示例:使用 fork fork() 方法可以创建一个新的子进程,并且可以在父进程和子进程之间建立一个双向的通信通道。 // parent.jsconst { fork } = require('child_process');const child = fork('./child.js');// 发送消息到子进程child.send('Hello from parent!');// 接收来自子进程的消息child.on('message', (message) => { console.log('Received from child:', message);});// child.jsprocess.on('message', (message) => { console.log('Received from parent:', message); process.send('Hello from child!');});
- 使用 net 模块 net 模块可以创建 TCP 或 IPC 服务器和客户端,适用于需要更复杂的通信场景。 示例:使用 net 模块 // server.jsconst net = require('net');const server = net.createServer((socket) => { socket.on('data', (data) => { console.log('Received:', data.toString()); socket.write('Hello from server!'); });});server.listen(8080, () => { console.log('Server listening on port 8080');});// client.jsconst net = require('net');const client = new net.Socket();client.connect(8080, '127.0.0.1', () => { console.log('Connected to server'); client.write('Hello from client!');});client.on('data', (data) => { console.log('Received from server:', data.toString()); client.destroy(); // 完成后关闭连接});
- 使用 cluster 模块 cluster 模块允许你轻松创建多个工作进程,它们共享同一个服务器端口。进程间可以通过 process.send() 和 process.on('message') 方法通信。 示例: // cluster.jsconst cluster = require('cluster');const http = require('http');if (cluster.isMaster) { for (let i = 0; i < 4; i++) { cluster.fork(); } cluster.on('message', (worker, message) => { console.log('Message from worker:', message); });} else { // Worker process http.createServer((req, res) => { res.writeHead(200); res.end('Hello World\n'); process.send('Request handled'); // 发送消息到主进程 }).listen(8000);}
- 使用外部库 也可以使用一些第三方库,比如 socket.io 或 Redis,进行更复杂的进程间通信,特别是在分布式系统中。
来源整理自:vue3js.cn 面试官系列



