2012-09-06 20 views
6

所以我正在Node.js中的一個項目上工作,我想打開一些額外的線程來更有效地處理處理負載。但是我使用帶有函數定義的類,並且當我嘗試將這些對象發送給工作線程時,對象中定義的函數消失,我只剩下對象中的其他字段。有沒有辦法向工作人員發送一個對象並保留這些功能,以便可以在工作人員中調用它們?Node.js發送一個帶有函數定義的對象到工作線程

var cluster = require('cluster'); 

if(cluster.isMaster){ 
    Monster = function(species){ 
     this.attack = function(){ 
      console.log('CHOMP'); 
     }; 
     this.name = species; 
    }; 
    var vamp = new Monster('vampire'), 
    worker = cluster.fork(); 
    worker.send({'monster' : vamp}); 
    } 
else{ 
    process.on('message', function(msg) { 
     console.log(msg.monster); //this logs "{ name: 'vampire' }" 
     msg.monster.attack(); //TypeError: Object #<Object> has no method 'attack' 
    }); 
} 

回答

2

不,線程之間沒有辦法傳遞函數。您只能傳遞JS普通對象(僅限數據)並使用當前線程中定義的函數處理它(如使用接收數據創建新對象)。

+2

哇,這真的限制了集羣模塊的功能。你知道是否有任何計劃將它添加到Node.js? –

+0

此功能與node.js體系結構相反。 Node.js事件循環在單線程中工作。集羣模塊只是啓動新的進程。他們都有自己的獨立記憶。多線程體系結構的實現需要支持具有共享內存和相關機制的線程,例如「互斥體」和「信號量」。這不是node.js的方式。 –

2

查理,我意識到你在一年前問過這個問題,但我想要做一些非常相似的事情,並且我遇到了你尚未標記答案的問題。我認爲我會採取「刺戳」的方式,告訴你我的代碼已經完成了。這種組織代碼的不同方式對我來說是一個非常可接受的解決方法,在我的node.js工作中。我很肯定這會給你一種方法來實現你想要的東西,即使你不能以你想要的方式去做。

聲明你的「下課」的集羣代碼之外,像這樣:

var cluster = require('cluster'); 

var Monster = function(species){ 
    this.attack = function(){ 
     console.log('CHOMP!'); 
    }; 
    this.die = function() { 
     console.log("Oh, what did I eat? I don't feel so good....\r\n"); 
     process.exit(0); 
    }; 
    this.scare = function() { 
     console.log("BOO! I am a " + this.name + "!"); 
    }; 
    this.name = species; 
}; 

if(cluster.isMaster){ 
    worker = cluster.fork(); 
    worker.send({'species' : 'Vampire'}); 
} 
else{ 
    process.on('message', function(msg) { 
     if(typeof msg.species !== "undefined") { 
      myMonster = new Monster(msg.species); 
      myMonster.scare(); 
      myMonster.attack(); 
      myMonster.die(); 
     } 
    }); 
} 

給一個旋轉,看看這是你能接受一個答案!

相關問題