2017-01-25 23 views
6

में सीपीयू गहन कार्यों के लिए child_process बनाम मैं node-unfluff, जो एचटीएमएल तार से सामग्री निकालता उपयोग करने के लिए कोशिश कर रहा हूँ। हालांकि, यह आमतौर पर चलाने के लिए ~ 200ms लेता है। चूंकि यह समकालिक रूप से चलता है, यह बहुत धीमा है। मैं इसे असंकालिक रूप से चलाने के लिए चाहता हूँ।वेब कर्मचारी Node.js

जहां तक ​​मुझे पता है, मेरे विकल्प वेब वर्कर्स (https://github.com/audreyt/node-webworker-threads) या child_process (https://nodejs.org/api/child_process.html) हैं। क्या अन्य बेहतर विकल्प हैं?

यदि नहीं, तो इनमें से कौन सा गति या अन्य कारकों के मामले में बेहतर है?

संपादित करें:

वहाँ भी है धागे ए गोगो (https://github.com/xk/node-threads-a-gogo) और छोटे कार्यकर्ता (https://github.com/avoidwork/tiny-worker)।

WebWorker धागे require का समर्थन नहीं करता है, ताकि अब एक विकल्प नहीं है।

यह संभव है require करने के लिए अपने load फ़ंक्शन का उपयोग करके ए गोगो धागे का उपयोग करके फ़ाइलें, लेकिन यह एक hacky वैकल्पिक हल की तरह लगता है।

छोटे कार्यकर्ता इस समय Github पर केवल 26 सितारों है, तो मैं उत्पादन कोड में इसका इस्तेमाल करने में संकोच कर रहा हूँ। यह require का समर्थन करता है।

मैं child_process का उपयोग कर हो, तो कोई बेहतर विकल्प मेरे अपने WebWorker कार्यान्वयन लेखन पर विचार कर रहा हूँ।

+0

आप अपने उपयोग के मामले में थोड़ा और व्याख्या कर सकते हैं? क्या आप एकाधिक यूआरएल प्रोसेसिंग में समांतरता प्राप्त करने की कोशिश कर रहे हैं या आप किसी भी तरह नोड-अपफफ के भीतर प्रदर्शन को बढ़ाने की कोशिश कर रहे हैं? जब आप नोड में लाइब्रेरी के आधार पर होते हैं तो आपने बाल प्रक्रियाओं का उपयोग करके कल्पना कैसे की? मानक नोड क्लस्टरिंग आपकी सूची में कोई विकल्प क्यों नहीं है (ध्यान में रखते हुए कि यह वास्तव में बाल प्रक्रियाओं पर भरोसा करता है)? – SylonZero

+0

मैं एक सर्वर के रूप में नोड का उपयोग कर रहा हूँ। यदि किसी फ़ंक्शन को चलाने के लिए 200ms लगते हैं, तो कोई भी उपयोगकर्ता 200ms में सर्वर प्रतिक्रिया प्राप्त नहीं कर सकता है। मैं इसे अतुल्यकालिक बनाना चाहता हूं ताकि सर्वर अवरुद्ध न हो। मैं एक और नोड प्रक्रिया शुरू करने के लिए 'child_process' का उपयोग कर सकता हूं। मैंने पहले कभी नोड क्लस्टरिंग का उपयोग नहीं किया है, लेकिन मेरी समझ यह है कि यह प्रत्येक कोर के लिए एक सर्वर बनाता है। यदि प्रत्येक कोर पर 'नोड-unfluff' चल रहा है, तो हर सर्वर अवरुद्ध है। –

+0

ठीक है, आपका प्रश्न स्पष्ट हो जाना शुरू हो रहा है। हालांकि, भले ही किसी फ़ंक्शन का उदाहरण (नोड-अपफ्लफ का उपयोग करना) सिंक्रोनस है, जो अन्य उदाहरणों को अन्य अनुरोधों को नोड को निकालने से रोकता नहीं है। इसलिए, एक उपयोगकर्ता को 200ms का इंतजार करना पड़ सकता है लेकिन इसका आमतौर पर यह मतलब नहीं है कि * अन्य * उपयोगकर्ताओं के लिए अनुरोध शुरू नहीं किए जा सकते हैं।क्या आपने परीक्षण किया है और पाया है कि इस unfluff मॉड्यूल का उपयोग वास्तव में समवर्ती अनुरोध ब्लॉक करता है? – SylonZero

उत्तर

1

आप श्रमिकों के साथ आवश्यकता का उपयोग कर सकते हैं।

requirejs.config({ 
    //By default load any module IDs from js/lib 
    baseUrl: 'js/lib', 
    //except, if the module ID starts with "app", 
    //load it from the js/app directory. paths 
    //config is relative to the baseUrl, and 
    //never includes a ".js" extension since 
    //the paths config could be for a directory. 
    paths: { 
     app: '../app' 
    } 
}); 

// Start the main app logic. 
requirejs(['jquery', 'canvas', 'app/sub'], 
function ($,  canvas, sub) { 
    //jQuery, canvas and the app/sub module are all 
    //loaded and can be used here now. 
}); 

यह एक साथ लाना

कार्यकर्ता: अपने कार्यकर्ता स्क्रिप्ट में आप के रूप में प्रति डॉक्स की आवश्यकता होती है आप एक मॉड्यूल के लिए एक config वस्तु पारित कर सकते हैं

self.importScripts('../path/require.js'); 

कॉल करने के लिए की आवश्यकता होगी। जेएस

self.importScripts('../path/require.js'); 
requirejs.config({ 
    //By default load any module IDs from path/lib 
    baseUrl: 'path/lib', 
    //except, if the module ID starts with "app", 
    //load it from the js/app directory. paths 
    //config is relative to the baseUrl, and 
    //never includes a ".js" extension since 
    //the paths config could be for a directory. 
    paths: { 
     app: '../app' 
    } 
}); 

// Start the main app logic. 
requirejs(['jquery', 'canvas', 'app/sub'], 
function ($,  canvas, sub) { 
    //jQuery, canvas and the app/sub module are all 
    //loaded and can be used here now. 
    // now you can post a message back to your callee script to let it know require has loaded 
    self.postMessage("initialized"); 
}); 

self.onmessage = function(message) { 
    // do cpu intensive work here, this example is not cpu intensive... 
    if(message.data === 'to process') { 
     self.postMessage("completed!"); 
    } 
} 

नोड कार्यकर्ता कॉल

var worker = new Worker('Worker.js'); 
worker.onmessage = function(event) { 
    var msg = event.data; 
    if(msg === 'initialized') { 
     worker.postMessage({data: 'to process'}); 
    } 
} 
संबंधित मुद्दे