Nodejs 多子进程间共享内存(变量)的问题
Nodejs 多子进程间共享内存(变量)的问题
不要共享内存(或者说 Node.js 也没提供共享内存的方法),如果是为了触发事件就用 cluster. worker.send
和 process.send
. 如果是要共享数据就用数据库和缓存。
6 回复
不要共享内存(或者说 Node.js 也没提供共享内存的方法),如果是为了触发事件就用 cluster. worker.send
和 process.send
. 如果是要共享数据就用数据库和缓存。
nodejs为什么没有提供一个共享内存的模块呢?
[@yakczh](/user/yakczh) jvm也没有啊。。要是你,你也会这么设计的。。。
[@myy](/user/myy) jvm是线程模式 全在内存里,不需要共享
lz换个思路啊,既然要共享内存为什么还要多进程,直接开多个线程不是更好吗
在 Node.js 中,多子进程间直接共享内存或变量是不支持的。但是可以通过进程间的通信机制来实现数据的传递和共享。cluster
模块提供了 worker.send
方法用于进程间的通信,而 process.send
方法则可以在主进程中接收这些消息。
示例代码
假设我们有一个主进程和一个子进程,主进程负责分配任务,子进程负责处理任务并返回结果。
主进程 (master.js)
const cluster = require('cluster');
const http = require('http');
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < 2; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
// Listen for messages from workers
process.on('message', (msg) => {
console.log(`Received message from worker: ${msg}`);
});
} else {
// Worker processes
console.log(`Worker ${process.pid} started`);
// Simulate some work and send result back to master
setTimeout(() => {
const result = { data: 'Processed Data' };
process.send(result);
}, 1000);
}
运行主进程
node master.js
解释
- 主进程:通过
cluster.fork()
创建了两个子进程。主进程监听来自子进程的消息,并处理这些消息。 - 子进程:模拟了一些工作,并通过
process.send(result)
将结果发送回主进程。 - 进程间通信:使用
process.send
和process.on('message')
实现进程间的数据传递。
这种方式虽然不是直接的内存共享,但可以实现进程间的数据交换,适用于大多数需要跨进程通信的场景。对于需要大量数据共享的情况,可以考虑使用数据库、缓存系统如 Redis 等进行数据存储和访问。