我试图在NodeJS中创建单独的进程。
如果我要分叉一个子进程并发送一个对象,该对象是否会通过引用传入?那么如果我要在子进程中编辑该对象上的变量,它也会在主进程上发生变化吗?或者,这样做的唯一方法是向主进程发送消息,告诉它将变量更改为什么?
答案 0 :(得分:1)
Node.js文档清楚地说:
重要的是要记住产生的Node.js子进程 除了IPC通信之外,它们独立于父级 在两者之间建立的渠道。每个流程都有自己的流程 内存,有自己的V8实例。
但Linux中存在共享内存的概念。这是一个名为'EMS.js'的库,允许在Node.js中使用它。
这是一个例子。我在孩子和父母中设置了数字,然后相应地阅读它们。
master.js:
const {fork} = require('child_process');
const ems = require('ems')(1);
const _ = require('lodash');
const shared = ems.new({
filename: '/tmp/shared.ems',
heapSize: 10000,
dimensions: 100,
useMap: true,
//Notice this option here
useExisting: false,
ES6proxies: true
});
setInterval(function () {
shared.parentProperty = `Parent sets: ${_.random(1, 100)}`;
console.log(shared.childProperty);
}, 500);
//I inherit stdio here to see the output of both processes in console
let child1 = fork('./slave-1.js', {stdio: 'inherit'});
从动1.js:
const _ = require('lodash');
console.log('Slave started');
const ems = require('ems')(1);
const shared = ems.new({
filename: '/tmp/shared.ems',
dimensions: 100,
useMap: true,
useExisting: true,
ES6proxies: true
});
setInterval(function () {
console.log(shared.parentProperty);
shared.childProperty = `Child sets: ${_.random(1, 100)}`;
}, 500);
还要查看the docs,因为有很多选项+很多东西,比如障碍等。另外要注意堆大小和尺寸选项,不要耗尽内存。
输出:
Slave started
undefined
Parent sets: 52
Child sets: 52
...