2013-07-10 11 views
10

सबसे पहले, मैं समझने की कोशिश कर रहा हूं कि नोड क्या है। जे। मेरे पास दो प्रश्न हैं।
Node.js में सिंगल थ्रेडेड और इवेंट लूप

प्रथम प्रश्न
फेलिक्स की the article से, यह कहा कि "वहाँ केवल एक कॉलबैक एक ही समय में फायरिंग हो सकता है। जब तक कि कॉलबैक का निष्पादन पूरा होने, अन्य सभी कॉलबैक लाइन में इंतजार करना"।

  1. पहले http अनुरोध घटना प्राप्त किया:

    फिर, निम्नलिखित कोड (आधिकारिक वेबसाइट NodeJS से नकल)

    var http = require('http'); 
    http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
    }).listen(8124, "127.0.0.1"); 
    

    दो ग्राहक अनुरोधों को एक साथ प्राप्त कर रहे हैं, तो निम्न कार्यप्रवाह का मतलब है के बारे में विचार करें , दूसरा अनुरोध कार्यक्रम प्राप्त हुआ।

  2. जैसे ही पहली घटना प्राप्त हुई, पहली घटना के लिए कॉलबैक फ़ंक्शन निष्पादित हो रहा है।
  3. जबकि, दूसरी घटना के लिए कॉलबैक फ़ंक्शन का इंतजार करना होगा।

क्या मैं सही हूँ? यदि मैं सही हूं, तो Node.js नियंत्रण अगर बहुत कम समय अवधि के भीतर हजारों ग्राहक अनुरोध हैं।

दूसरा प्रश्न
अवधि "घटना लूप" ज्यादातर Node.js विषय में प्रयोग किया जाता है। मैंने http://www.wisegeek.com/what-is-an-event-loop.htm से निम्नलिखित के रूप में "इवेंट लूप" समझा है;

एक ईवेंट लूप - या मुख्य पाश, प्रोग्राम के भीतर एक निर्माण है जो प्रारंभिक ईवेंट के बाद ईवेंट को नियंत्रित और प्रेषित करता है।

प्रारंभिक घटना एक कुंजीपटल पर एक बटन धक्का या (Node.js में एक कार्यक्रम पर एक बटन क्लिक सहित कुछ भी, हो सकता है, मुझे लगता है कि प्रारंभिक घटनाओं http अनुरोध, डाटाबेस प्रश्नों या I/O फ़ाइल हो जाएगा पहुंच)।

यह एक पाश कहा जाता है, इसलिए नहीं कि घटना हलकों और लगातार होता है, लेकिन क्योंकि पाश की घटना के लिए तैयार करता है, घटना की जांच करता है, एक घटना डिस्पैच और फिर से प्रक्रिया को दोहराता है।

मैं दूसरा पैराग्राफ के बारे में एक संघर्ष विशेष रूप से वाक्यांश "प्रक्रिया फिर से दोहराता है"। मैंने स्वीकार किया कि उपरोक्त प्रश्न से ऊपर http.createServer कोड बिल्कुल "ईवेंट लूप" है क्योंकि यह बार-बार http अनुरोध ईवेंट सुनता है।

लेकिन मुझे नहीं पता कि निम्न कोड की पहचान कैसे करें जैसे ईवेंट-संचालित या ईवेंट लूप। यह डीबी क्वेरी समाप्त होने के बाद निकाल दिए गए कॉलबैक फ़ंक्शन को छोड़कर कुछ भी दोहराया नहीं जाता है।

database.query("SELECT * FROM table", function(rows) { 
    var result = rows; 
}); 

कृपया, मुझे अपनी राय और उत्तर सुनें।

उत्तर

7

उत्तर एक, आपका तर्क सही है: दूसरा कार्यक्रम इंतजार करेगा।और जहां तक ​​इसकी कतारबद्ध कॉलबैक समय आ जाएगा, निष्पादित होगा।

साथ ही, याद रखें कि तकनीकी दुनिया में "एक साथ" जैसी कोई चीज़ नहीं है। सब कुछ बहुत विशिष्ट जगह और समय है।

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

थ्रेड - महंगी हैं, और धागे की सर्वर क्षमता सीधे मेमोरी से संबंधित है। तो क्लासिक वेब अनुप्रयोगों में से अधिकांश केवल इसलिए पीड़ित होंगे क्योंकि रैम का उपयोग धागे पर किया जाता है जो बस डेटाबेस क्वेरी ब्लॉक या इसी तरह के होते समय निष्क्रिय होते हैं। नोड में यह कोई मामला नहीं है।

फिर भी, यह cluster के माध्यम से कई धागे (child_process के रूप में) बनाने की अनुमति देता है, जो और भी अधिक संभावनाएं फैलता है।

उत्तर दो। "लूप" जैसी कोई चीज नहीं है जिसके बारे में आप सोच सकते हैं। उन दृश्यों के पीछे कोई लूप नहीं होगा जो जांच करता है कि कनेक्शन हैं या कोई डेटा प्राप्त हुआ है और इसी तरह। यह आजकल Async विधियों द्वारा संभाला जाता है।

तो आवेदन बिंदु से, कोई 'मुख्य पाश' नहीं है, और डेवलपर बिंदु दृश्य से सबकुछ घटना-संचालित (ईवेंट-लूप नहीं) है।

http.createServer के मामले में, आप अनुरोधों के जवाब के रूप में कॉलबैक को बाध्य करते हैं। सभी सॉकेट ऑपरेशंस और आईओ सामान दृश्यों के पीछे, साथ ही HTTP हैंडशेकिंग, पार्सिंग हेडर, प्रश्न, पैरामीटर आदि के पीछे भी होंगे। दृश्यों और नौकरी के पीछे ऐसा होने के बाद, यह डेटा रखेगा और कुछ डेटा के साथ इवेंट लूप पर कॉलबैक पुश करेगा। एक बार इवेंट लूप बीमार हो जाएंगे और समय आएगा, यह नोड.जेएस एप्लिकेशन में निष्पादित होगा दृश्यों के पीछे से डेटा के साथ आपके कॉलबैक को संदर्भित करेगा।

डेटाबेस अनुरोध के साथ - एक ही कहानी। यह बीमार तैयार है और सामान पूछता है (इसे फिर भी एसिंक कर सकता है), और उसके बाद डाटाबेस जवाब देने के बाद कॉलबैक होगा और डेटा संदर्भ के लिए डेटा तैयार किया जाएगा।

ईमानदार होने के लिए, आपको node.js के साथ सभी अवधारणाओं को समझना है, लेकिन घटनाओं के कार्यान्वयन को नहीं करना है। और इसे करने का सबसे अच्छा तरीका - प्रयोग।

+0

क्या होता है यदि 'CreateServer' में कॉलबैक (async) ऑपरेशन हैं? पहले अनुरोध करने के लिए कुछ सिंक ऑपरेशन ट्रिगर कॉलबैक प्रक्रिया तुरंत कहेंगे? और दो अनुरोध संसाधित करना प्रारंभ करते हैं जबकि पहले अनुरोध से कॉलबैक अभी भी चल रहा है? – Manali

1

1) हाँ, आप सही हैं।

यह काम करता है क्योंकि नोड के साथ आप जो कुछ भी करते हैं वह मुख्य रूप से I/O बाध्य होता है।

जब कोई नया अनुरोध (ईवेंट) आता है, तो इसे कतार में डाल दिया जाता है। प्रारंभिक समय पर, नोड एक थ्रेडपूल आवंटित करता है जो I/O बाध्य प्रसंस्करण, जैसे नेटवर्क/सॉकेट कॉल, डेटाबेस इत्यादि के लिए धागे को बढ़ाने के लिए ज़िम्मेदार है (यह गैर-अवरुद्ध है)।

अब, आपके "कॉलबैक" (या ईवेंट हैंडलर) बेहद तेज़ हैं क्योंकि आप जो कुछ भी कर रहे हैं, वह सीपीयू और आई/ओ ऑपरेशंस की संभावना है, सीपीयू गहन नहीं।

इसलिए, ये कॉलबैक यह महसूस करते हैं कि उन्हें समानांतर में संसाधित किया जा रहा है, लेकिन वे वास्तव में नहीं हैं, क्योंकि असली समांतर काम थ्रेडपूल (बहु-थ्रेडिंग के साथ) के माध्यम से किया जा रहा है, जबकि कॉलबैक प्रति-से हैं केवल इन धागे से परिणाम प्राप्त करना ताकि प्रसंस्करण जारी रह सके और ग्राहक को प्रतिक्रिया भेज सकें।

आप आसानी से इस की पुष्टि कर सकते हैं: अगर आपके कॉलबैक भारी सीपीयू जिम्मेदारी होती है, आप सुनिश्चित करें कि आप अनुरोध प्रति सेकंड के हजारों कार्रवाई करने के लिए सक्षम नहीं होगा हो सकता है और यह वास्तव में बुरा नीचे मापता है, एक बहु लड़ी की तुलना प्रणाली।

2) आप सही हैं, फिर से।

दुर्भाग्य से, इन सभी अवशेषों के कारण, आपको पृष्ठभूमि में क्या हो रहा है यह समझने के लिए गोता लगाने की ज़रूरत है। हालांकि, हाँ, एक लूप है।

विशेष रूप से, नोडज libuv के साथ लागू किया गया है।

read पर दिलचस्प।

लेकिन मुझे नहीं पता कि निम्न कोड की पहचान कैसे करें जैसे घटना-संचालित या ईवेंट लूप। यह डीबी क्वेरी समाप्त होने के बाद निकाल दिए गए कॉलबैक फ़ंक्शन को छोड़कर कुछ भी दोहराया नहीं जाता है।

घटना-संचालित एक ऐसा शब्द है जब वहाँ एक घटना पाश है आप सामान्य रूप से उपयोग आप सहयोगी है, और यह कि इस तरह के क्लिक-ऑन-बटन के रूप में की घटनाओं से प्रेरित है एक ऐप्लिकेशन का मतलब है, डेटा पहुंचे, आदि आम तौर पर ऐसी घटनाओं के लिए एक कॉलबैक।

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