2016-07-26 51 views
0

我在为子进程提供相同的模块或对象时遇到问题。 因为没有办法发送一个普通的对象到我的子进程(我只能发送“服务器”,套接字或JSON对象),我试图创建一个模块,我需要在我的主app.js ,在它上面设置任何必要的数据,而不是在我的子进程中,我也会要求它。Node.js - 在子进程中需要相同的模块

问题是,在我的子进程中,我得到了一个不同的oject,而不是我在app.js.中创建的那个oject。我试图用一个普通的对象,并设置它的属性,以及一个功能...

//module file 
var Data = function(){ 
    this.data = null; 

    return this; 
}; 

module.exports = Data; 

...我用这样的...

//app.js 
var module = require("moduleName")(); 
module.data = "something"; 

...然而,在我的孩子的过程中,数据仍然是空

//Child process 
var module = require("moduleName")(); 
console.log(module.data); --> null 

两个文件(app.js和子进程的文件)都在同一个项目,和目录。

我唯一的客串是,因为我创造了我的子进程fork(),它可能使用的模块不同的缓存...

那么,有什么办法可以实现,得到了相同的对象在我的子进程,还是有办法发送一个对象(而不是JSON)到我的子进程?

提前致谢!

回答

2

子进程和父进程是不同的进程 - 它们不共享内存。

您可能必须使用它们之间的某些进程间通信来同步数据,或者使用像Redis这样的所有进程都会使用的通用服务。

您目前正在尝试这样做的方式是不可能的,不仅仅是在节点中。任何两个进程都有自己的内存,它们之间发送的所有内容不会被自己共享或同步。

如果不使用像Redis这样的服务,您可能会通过发送消息与您的进程进行通信。

child是你父进程的子进程的引用,那么你就可以发送邮件:

child.send({some:"object"}); 

在你的孩子,你可以听这些消息:

process.on('message', function(object) { 
    // do something with object 
    // like update your local copy 
}); 

这样,每次对象发生变化时,父进程都可以通知其所有子进程,并向其发送新的副本。

更多信息:

+0

感谢您的快速答复!我已经在使用两者之间的通信线路,但是我提到的方式会更容易一些。 :-)无论如何,我会坚持那个,现在很清楚,我无法达到我提到的方式。 – Dave

+0

@Dave我用一种方式更新了一个答案,以通知子进程某些对象发生了变化,并且每次都发送新的数据。您也可以采用其他方式将数据从子进程发送到父进程。 – rsp

+0

是的,我已经在使用这种方法,但我认为,如果我在main和子进程之间通过send和on组合进行大量的通信(主要是因为它只有一个通道可以使用),它可能会减慢子进程,但这只是一个猜测。这就是为什么我想在子进程中包含一些东西(这些东西已经在我的app.js中使用),所以我可以提供一些其他的通道(比如使用我已经在应用中启动的socket.io。 JS) – Dave