Nodejs 多子进程间共享内存(变量)的问题

Nodejs 多子进程间共享内存(变量)的问题

不要共享内存(或者说 Node.js 也没提供共享内存的方法),如果是为了触发事件就用 cluster. worker.sendprocess.send. 如果是要共享数据就用数据库和缓存。

6 回复

不要共享内存(或者说 Node.js 也没提供共享内存的方法),如果是为了触发事件就用 cluster. worker.sendprocess.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.sendprocess.on('message') 实现进程间的数据传递。

这种方式虽然不是直接的内存共享,但可以实现进程间的数据交换,适用于大多数需要跨进程通信的场景。对于需要大量数据共享的情况,可以考虑使用数据库、缓存系统如 Redis 等进行数据存储和访问。

回到顶部