2012-08-19 21 views
5

पर एकाधिक थ्रेड में कार्य चलाएं मुझे node.js के साथ कुछ मदद चाहिए क्योंकि मैं इसके लिए नौसिखिया हूं। मेरे पास डेटा की एक सरणी है और उस डेटा के साथ कई थ्रेड (सभी CPU कोर का उपयोग करके) में फ़ंक्शन चलाने की आवश्यकता है। सामान्य रूप से मेरे लिए भाषाओं में मैं धागे की संख्या के साथ थ्रेडपूल बनाता हूं, कुछ कार्यों को धक्का देता हूं, खत्म होने तक प्रतीक्षा करता हूं, कतार में और कार्य भेजता हूं। लेकिन मैं यह नहीं समझ सकता कि इसे नोडजेस में कैसे किया जाए।node.js

पीएस: मैं नवीनतम 0.8 शाखा का उपयोग कर रहा हूं।

+1

मुझे लगता है कि आपको इसकी आवश्यकता है: [क्लस्टर] (http://nodejs.org/api/cluster.html) –

+0

घटना-संचालित प्रोग्रामिंग अब मेरे लिए बहुत असामान्य है .. मेरे कार्य के साथ उपयोग करने के उदाहरणों के साथ कुछ मदद चाहिए .. – elgato

+0

चूंकि नोड.जेएस में धागे नहीं हैं, इसलिए आपको पारंपरिक यूनिक्स प्रोग्रामिंग अवधारणाओं (यानी फोर्किंग, स्पॉन्गिंग और आईपीसी-इंटर प्रोसेस कम्युनिकेशन) के संदर्भ में और सोचने की आवश्यकता है। एक एनपीएम मॉड्यूल है जिसे हुक.ओओ कहा जाता है जो आईपीसी को अपने स्वयं के पेलोड प्रारूप आदि को परिभाषित करने के बजाय अच्छा और नोड जैसा बनाता है, जैसा आम तौर पर मामला होगा: https://github.com/hookio/hook.io – d11wtq

उत्तर

4

नोडज एक ही प्रक्रिया पर चलाने के लिए बनाया गया है, लेकिन आप spawn अन्य प्रक्रियाओं को कर सकते हैं। cluster मॉड्यूल बच्चे_प्रोसेस मॉड्यूल से fork विधि का उपयोग करता है, लेकिन इसका उद्देश्य प्रक्रियाओं में सर्वर के कनेक्शन वितरित करना और उसी पोर्ट को साझा करना है।

मुझे लगता है कि आप exec चाहते हैं। उदाहरण:

var exec = require('child_process').exec, 
child; 

var array = ["a", "b", "c", "d", "e"]; // your array of data 

var n = array.length; // length 
var done = 0; // jobs done 
var i = n; // iterator 

while(i--) { // reverse while loops are faster 
    (function (argument) { // A closure 
     child = exec('node otherFunction.js '+argument, // Spawn the process, with an item from your array as an argument. 
      function (error, stdout, stderr) { 
      if (error === null) { 
       done += 1; 
       if (done === n) { 
        console.log('Everything is done'); 
       } 
      } 
     }); 
    })(array[i]); 
} 

ऊपर पाठ्यक्रम बुरा कोड की है और यहां तक ​​कि परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह काम करेगा। आपको बस इतना करना है कि आप उस क्रिया को कॉल करें जिसे आप सरणी के आइटमों पर otherFunction.js में कॉल करना चाहते थे, इसके अंदर आपको process.argv में तर्क मिलेगा।

+2

// रिवर्स जबकि लूप तेजी से होते हैं - इस तरह के विशाल प्रदर्शन लाभ के लिए व्यापार पठनीयता के लिए निश्चित रूप से मूल्यवान है। केवल SO –

+2

IMHO पर यह पठनीयता –

+0

पर भी प्रभाव को प्रभावित नहीं करता है यदि आप गति की परवाह करते हैं, तो लूप के अंदर बंद न करें, इससे आपको बहुत कुछ खो देता है (इसके बजाय ++ के साथ लूपिंग से कहीं अधिक) http: //jsperf.com/closure-vs-name-function-in-a-loop/2 भी: http://jslinterrors.com/dont-make-functions-within-a-loop –