9

所以我正在使用 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'
    });
}
4

3 回答 3

6

不,没有办法在线程之间传递函数。您只能传递 JS 普通对象(仅限数据)并使用当前线程中定义的函数处理它(例如使用接收到的数据创建新对象)。

于 2012-09-06T15:51:44.997 回答
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();
        }
    });
}

试一试,看看这是否是您可以接受的答案!

于 2013-09-08T08:06:49.487 回答
0

好的,偶然发现了这个答案,我觉得奇怪的是没有人提出这个问题,但这可能是一个比问题更现代的功能:

评估

let str = "() => { console.log('test') }"
let func = eval(str)
func()

认为这里发生了什么很明显,您可以将任何字符串解析为 javascript,您可以将字符串发送给工作人员,因此您可以使用函数构建和对象:

let obj = { a: "() => { ... }" }

并将对象发送过来。(JSON.stringify(obj) 首先,然后你必须先解析对象,然后分别解析所有子字符串)

于 2020-02-04T10:23:45.870 回答