2012-11-14 16 views
45

यहां मेरी समस्या है। मैंने एक छोटी सी स्क्रिप्ट लागू की जो कुछ भारी गणना करता है, एक node.js मॉड्यूल के रूप में। इसलिए, यदि मैं "node myModule.js" टाइप करता हूं, तो यह एक सेकंड के लिए गणना करता है, फिर एक मान देता है। अब, मैं उस मॉड्यूल का उपयोग अपने मुख्य नोड.जेएस प्रोग्राम से करना चाहता हूं। मैं सिर्फ एक "doSomeCalculation" समारोह में सभी गणना डाल सकता है तो कार्य करें:मैं node.js मॉड्यूल को node.js प्रोग्राम की बाल प्रक्रिया के रूप में कैसे निष्पादित कर सकता हूं?

var myModule = require("./myModule"); 
myModule.doSomeCalculation(); 

लेकिन उस अवरुद्ध किया जाएगा, इस प्रकार यह बुरा होगा। मैं इसे गैर-अवरुद्ध तरीके से उपयोग करना चाहता हूं, उदाहरण के लिए, डीबी कॉल मूल रूप से हैं। इसलिए मैं, child_process.spawn और कार्यकारी उपयोग करने के लिए इस तरह की कोशिश की:

var spawn = require("child_process").spawn; 
var ext = spawn("node ./myModule.js", function(err, stdout, stderr) { /* whatevs */ }); 
ext.on("exit", function() { console.log("calculation over!"); }); 

लेकिन, बेशक, यह काम नहीं करता। मैंने अपने मॉड्यूल में इवेंटइमीटर का उपयोग करने की कोशिश की, "गणना पूर्ण" घटनाओं को उत्सर्जित किया और ऊपर दिए गए उदाहरण में "ext" चर पर संबंधित श्रोता जोड़ने की कोशिश की। अभी भी काम नहीं करता है।

फोर्क के लिए, वे वास्तव में नहीं हैं जो मैं करने की कोशिश कर रहा हूं। फोर्क्स को मुख्य कार्यक्रम में गणना-संबंधित कोड डालने की आवश्यकता होगी, बच्चे में गणना करनी होगी, जबकि माता-पिता जो कुछ भी करता है, और फिर मैं परिणाम कैसे वापस करूँगा?

तो मेरा प्रश्न यह है: क्या मैं कुछ गैर-अवरुद्ध गणना करने के लिए एक बाल प्रक्रिया का उपयोग कर सकता हूं, जब गणना नोड फ़ाइल में रखी जाती है, या यह असंभव है? क्या मुझे इसके बजाय पाइथन लिपि में भारी गणना करना चाहिए? दोनों मामलों में, मैं बाल प्रक्रिया में तर्क कैसे पारित कर सकता हूं - उदाहरण के लिए, एक छवि?

+7

"शुभ दोपहर"? यह सुबह हो सकता है (या इससे भी बदतर!) कहीं और :) :) – elmigranto

उत्तर

105

मुझे लगता है कि आप क्या कर रहे हैं child_process.fork() एपीआई है।

उदाहरण के लिए, आप निम्न दो फ़ाइलें अगर:

main.js में:

var cp = require('child_process'); 
var child = cp.fork('./worker'); 

child.on('message', function(m) { 
    // Receive results from child process 
    console.log('received: ' + m); 
}); 

// Send child process some work 
child.send('Please up-case this string'); 

worker.js में:

process.on('message', function(m) { 
    // Do work (in this case just up-case the string 
    m = m.toUpperCase(); 

    // Pass results back to parent process 
    process.send(m.toUpperCase(m)); 
}); 

तब मुख्य चलाने के लिए (और अंडे worker.js कोड के लिए एक बाल कार्यकर्ता प्रक्रिया ...)

$ node --version 
v0.8.3 

$ node main.js 
received: PLEASE UP-CASE THIS STRING 
+0

धन्यवाद आपके उत्तर के लिए बहुत कुछ! यह अब पूरी तरह से काम करता है। – user1822364

+11

कॉल बेहतर होना चाहिए 'cp.fork (__ dirname +'/worker ');' यदि आप किसी अन्य स्थान से 'main.js' चलाते हैं तो इसे काम करने के लिए। – CoDEmanX

2

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

कारण यह काम नहीं कर रहा है कि आप exec के बजाय spawn का उपयोग कर रहे हैं।

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