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

チャーリー、あなたが 1 年前にこの質問をしたことは承知していますが、私は非常に似たようなことをしたかったのですが、あなたがまだ回答をマークしていないあなたの質問に出くわしました。私はそれを「突き刺して」、あなたのコードで何をしたかをお見せしようと思いました. コードを整理するこの別の方法は、私の 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 に答える