2012-01-24 6 views
53

मैं node.js के विवरण के माध्यम से जा रहा था और यह पता चला कि यह असीमित प्रोग्रामिंग का समर्थन करता है हालांकि अनिवार्य रूप से यह एक थ्रेडेड मॉडल प्रदान करता है।असीमित प्रोग्रामिंग एक थ्रेड प्रोग्रामिंग मॉडल में कैसे काम करता है?

ऐसे मामलों में एसिंक्रोनस प्रोग्रामिंग कैसे संभाला जाता है? क्या यह रनटाइम स्वयं ही धागे बनाता है और प्रबंधित करता है, लेकिन प्रोग्रामर धागे को स्पष्ट रूप से नहीं बना सकता है? यह अच्छा होगा अगर कोई मुझे इस बारे में जानने के लिए कुछ संसाधनों को इंगित कर सके।

उत्तर

70

अब मेरे साथ यह कहें: async प्रोग्रामिंग का अर्थ बहु-थ्रेडेड नहीं है।

जावास्क्रिप्ट एक एकल थ्रेडेड रनटाइम है - आप बस जेएस में नए धागे बनाने में सक्षम नहीं हैं क्योंकि भाषा/रनटाइम इसका समर्थन नहीं करता है।

फ्रैंक यह सही ढंग से कहता है (हालांकि समझदारी से) अंग्रेजी में: एक मुख्य ईवेंट लूप होता है जो आपके ऐप में आने पर संभालता है। इसलिए, "इस HTTP अनुरोध को संभाल लें" ईवेंट कतार में जोड़ा जाएगा, फिर उपयुक्त होने पर ईवेंट लूप द्वारा संभाला जाएगा।

जब आप एसिंक ऑपरेशन (उदाहरण के लिए एक mysql डीबी क्वेरी) कहते हैं, node.js "हे, इस क्वेरी को निष्पादित करें" mysql पर भेजता है। चूंकि इस क्वेरी में कुछ समय लगेगा (मिलीसेकंड), node.js MySQL async लाइब्रेरी का उपयोग करके क्वेरी निष्पादित करता है - इवेंट लूप पर वापस आ रहा है और कुछ और कर रहा है जबकि mysql को वापस पाने के लिए प्रतीक्षा कर रहा है। उस HTTP अनुरोध को संभालने की तरह।

संपादित: इसके विपरीत, Node.js बस इंतजार कर सकता है चारों ओर mysql में वापस पाने के लिए (कुछ भी नहीं कर रही है)। इसे एक तुल्यकालिक कॉल कहा जाता है। एक रेस्तरां की कल्पना करो, जहां आपका वेटर खाना पकाने के लिए आपका ऑर्डर सबमिट करता है, फिर शेफ पकाते समय उसके अंगूठे नीचे बैठता है और twiddles। एक रेस्तरां में, जैसे node.js प्रोग्राम में, ऐसा व्यवहार मूर्खतापूर्ण है - आपके पास अन्य ग्राहक हैं जो भुखमरी हैं और उन्हें सेवा करने की आवश्यकता है। इस प्रकार आप यह सुनिश्चित करने के लिए जितना संभव हो सके असीमित होना चाहते हैं कि एक वेटर (या नोड.जेएस प्रक्रिया) जितना हो सके उतने लोगों की सेवा कर रहा है।

संपादित किया

Node.js mysql सी लाइब्रेरी का उपयोग कर, इसलिए तकनीकी रूप से उन सी पुस्तकालयों धागे बंद अंडे सकता है के साथ संचार, लेकिन जावास्क्रिप्ट के अंदर आप धागे के साथ कुछ नहीं कर सकते।

+9

अधिक सटीक। "नोड.जेएस एक एसिंक्रोनस एपीआई के माध्यम से mysql के साथ संचार करता है। एसिंक्रोनस एपीआई का कार्यान्वयन सी में है और यह कार्यान्वयन सिर्फ थ्रेडपूल के माध्यम से सिंक्रोनस एपीआई चलाया जा सकता है"। तथ्य यह है कि एसिंक्रोनस एपीआई आंतरिक रूप से थ्रेड पूल का उपयोग कर सकता है, वह निम्न स्तर का विवरण है जिसकी आपको परवाह नहीं है। – Raynos

+0

आह, इसलिए mysql एक अलग थ्रेड में चल रहा है, फिर यह एक ईवेंट को जेएस में वापस करने पर वापस जोड़ता है।अगर मैं अपने स्वयं के एसिंक मॉड्यूल बनाना चाहता था तो मैं उसी प्रभाव को प्राप्त करने के लिए नोड में बाल प्रक्रियाओं का उपयोग कर सकता था। – BigOmega

+3

मुझे लगता है कि यहां 'थ्रेड' शब्द से बचने के लिए वास्तव में बेहतर है-लोग इसे सुनते समय झूठे निष्कर्षों पर कूदते हैं। एक एसिंक्रोनस कॉल थ्रेड का उपयोग कर सकता है, या एक प्रक्रिया कांटा कर सकता है, या जो कुछ भी कर सकता है; महत्वपूर्ण बात यह है कि घटना लूप में बाद में कॉलबैक या एक घटना हो सकती है। – flow

8

रयान ने यह सबसे अच्छा कहा: सिंक/एसिंक एकल/बहु-थ्रेडेड के लिए ऑर्थोगोनल है। एकल और बहु ​​थ्रेडेड मामलों के लिए एक मुख्य ईवेंट लूप होता है जो Reactor Pattern का उपयोग करके पंजीकृत कॉलबैक को कॉल करता है। सिंगल थ्रेडेड केस के लिए कॉलबैक क्रमशः मुख्य धागे पर आवेदक लगाए जाते हैं। बहु थ्रेडेड केस के लिए उन्हें अलग-अलग धागे (आम तौर पर थ्रेड पूल का उपयोग करके) पर बुलाया जाता है। यह वास्तव में एक सवाल है कि कितना विवाद होगा: यदि सभी अनुरोधों को एक ही डेटा संरचना (ग्राहकों की एक सूची कहें) तक सिंक्रनाइज़ करने की आवश्यकता होती है तो एकाधिक थ्रेडेड होने के लाभ कम हो सकते हैं। यह समस्या निर्भर है।

जहां तक ​​कार्यान्वयन, यदि एक ढांचा एकल थ्रेड किया गया है तो यह poll/select सिस्टम कॉल का उपयोग कर रहा है यानी ओएस असीमित घटना को ट्रिगर कर रहा है।

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