2012-09-06 17 views
6

पर फ़ंक्शन परिभाषाओं के साथ एक ऑब्जेक्ट भेज रहा है इसलिए मैं नोड.जेएस में एक प्रोजेक्ट पर काम कर रहा हूं और मैं प्रोसेसिंग लोड को अधिक कुशलता से संभालने के लिए कुछ अतिरिक्त धागे खोलना चाहता हूं। लेकिन मैं उनके साथ फ़ंक्शन परिभाषाओं के साथ कक्षाओं का उपयोग कर रहा हूं और जब मैं उन ऑब्जेक्ट्स को कार्यकर्ता थ्रेड पर भेजने का प्रयास करता हूं, तो ऑब्जेक्ट में परिभाषित फ़ंक्शंस गायब हो जाते हैं और मुझे केवल ऑब्जेक्ट के अन्य फ़ील्ड के साथ छोड़ दिया जाता है। क्या कार्यकर्ता को एक वस्तु भेजने और कार्यों को संरक्षित करने का कोई तरीका है ताकि उन्हें कार्यकर्ता के भीतर बुलाया जा सके?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

नहीं, धागे के बीच कार्यों को पारित करने का कोई तरीका नहीं है। आप केवल जेएस सादे ऑब्जेक्ट्स (डेटा केवल) पास कर सकते हैं और इसे मौजूदा थ्रेड में परिभाषित कार्यों के साथ संभाल सकते हैं (जैसे प्राप्त डेटा के साथ नई वस्तु बनाएं)।

+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(); 
     } 
    }); 
} 

दें कि एक बार आज़माएंगे करें और देखें कि यह एक जवाब आप स्वीकार कर सकते है!

संबंधित मुद्दे