2013-03-20 4 views
19
  1. मैं सीख लिया है कि Node.js libeio आंतरिक रूप का उपयोग async फ़ाइल प्रदर्शन करने के लिए मैं/हे, थ्रेड पूल के साथ, * nix मंच पर, मैं सही हूँ?
  2. async नेटवर्क आई/ओ के बारे में क्या? क्या यह libev द्वारा किया जाता है? क्या एक थ्रेड पूल भी है?
  3. यदि अंदर थ्रेड पूल है, तो पारंपरिक एक-थ्रेड-प्रति-अनुरोध मॉडल से यह अधिक कुशल कैसे हो सकता है? और क्या यह प्रति थ्रेड I/O अनुरोध है?
  4. और विंडोज़ पर तंत्र क्या है? मुझे पता है कि यह आईओसीपी द्वारा किया गया है, और एक कर्नेल स्तर धागा पूल है, है ना?
  5. लिनक्स के पास अभी तक विंडोज आईओसीपी जैसी मूल पूरी तरह से एआईओ तंत्र क्यों नहीं है? क्या भविष्य में होगा?

अद्यतन changchang के जवाब के अनुसार:भ्रम Node.js आंतरिक अतुल्यकालिक मैं/हे तंत्र

  1. मैं, source code @changchang दे दिया है पर एक त्वरित दृश्य लिया पाया गया कि डिफ़ॉल्ट थ्रेड पूल आकार से UV_THREADPOOL_SIZE रीसेट किया जा सकता, मैं सोच रहा हूँ किस मामले में इसका इस्तेमाल किया जाएगा?
  2. मुझे यह थ्रेड पूल का उपयोग करने के लिए getaddrinfo भी मिला, क्या एफएस को छोड़कर कोई और है? और यदि इस थ्रेड पूल में सभी सिंक जॉब्स किए जाएंगे, तो डिफ़ॉल्ट आकार '4' पर्याप्त है?
  3. मेरी समझ के रूप में, अब node.js प्रक्रिया में 6 मूल धागे होंगे: 1 वी 8 थ्रेड (ईवेंट लूप, जहां उपयोगकर्ता जावास्क्रिप्ट कोड चलता है), 1 libuv इवेंट लूप, और थ्रेड पूल में 4, क्या मैं सही हूँ?
  4. और मैं इन धागे को अपने खोल (उबंटू) में कैसे देख सकता हूं? मैं ps -eLf का उपयोग करता हूं grep नोड | ग्रेप -v ग्रेप केवल देखा दो:

    जड़ 16148 7492 16148 0 2 20:43 अंक/26 00:00:00 ./bin/node /home/aaron/workspace/test.js
    जड़ 16148 7492 16149 0 2 20:43 अंक/26 00:00:00 ./bin/node /home/aaron/workspace/test.js

+0

यहाँ देखें http://stackoverflow.com/questions/10680601/nodejs-event-loop – user568109

+1

Node.js वास्तव में सार का उपयोग करता है [libuv] (https://github.com/joyent/libuv/) सभी समर्थित प्लेटफार्मों के लिए एसिंक्रोनस आईओ – Milan

+0

@ user568109 मैंने इसे पढ़ लिया है, लेकिन इसे सीधे जवाब नहीं मिल सकता है, वास्तव में, अस्पष्ट अभिव्यक्ति मुझे और भ्रमित करती है। इसने उल्लेख किया कि लिबियो 'सॉकेट समेत इनपुट आउटपुट असीमित रूप से प्रदर्शन करते हैं', मुझे संदेह है। मैंने इसे कहीं से सीखा है: क्योंकि नियमित फाइलों पर एपोल का उपयोग नहीं कर सकता है, इसलिए थ्रेड के साथ एओओ करने के लिए यहां libeio आता है। –

उत्तर

24
  1. सबसे पहले, libuvlibeio इसे से हटा दिया गया है । लेकिन जैसा कि आपने बताया है, यह libeio जैसे थ्रेड पूल के साथ async फ़ाइल I/O निष्पादित करता है।

  2. libuvlibev को भी हटा देता है। यह एसिंक नेटवर्क I/O को विभिन्न प्लेटफार्मों में एसिंक I/O इंटरफेस पर आधारित करता है, जैसे epoll, kqueue और IOCP, थ्रेड पूल के बिना। एक इवेंट लूप है जो uv के मुख्य धागे पर चलता है जो I/O घटनाओं को चुनाव करता है और उन्हें संसाधित करता है।

  3. libuv के अंदर थ्रेड पूल एक निश्चित आकार धागा पूल (4 in uinx like system) है। यह कार्य कतार भूमिका निभाता है और अनुरोधों में वृद्धि होने पर अनिश्चित काल तक थ्रेड उत्पन्न करके सिस्टम संसाधनों के थकावट से बचाता है।

+0

बहुत टैंक, बहुत सारे संसाधन पुराने हैं, आपने अभी मुझे बचाया है! –

+2

@AaronWang यदि आपको अपने प्रश्न का उत्तर दिया गया तो आपको इसे स्वीकार करना चाहिए। कोर – travis

+0

AFAIK नोड सेट libuv थ्रेड पूल आकार सबसे पहले: * libuv [...] करता है async नेटवर्क मैं/हे [...] ** एक धागा पूल बिना ***। बाद में: * libuv के अंदर धागा पूल [...] *। यह मेरे लिए विरोधाभासी प्रतीत होता है। –

2

uptil संस्करण 0.6 libev इस्तेमाल किया घटना लूप और libeio अतुल्यकालिक मैं के लिए चलाने के लिए नोड/हे, (यूनिक्स बैकएंड भारी इन दो पुस्तकालयों पर बैठता है)।लेकिन libuvversion 0.8 में libev और libeio की जगह शुरू कर दिया है। यह घटना पूल में सभी आईओओ और घटनाओं का प्रदर्शन, प्रबंधन और प्रबंधन करता है। libuv क्रॉस-प्लेटफार्म एसिंक्रोनस आईओ पुस्तकालयों में पसंद है।

  1. हाँ, तक नोड 0.6, 0.8 में पदावनत और थ्रेड पूल
  2. हाँ का उपयोग करता है, लेकिन libev थ्रेड पूल का उपयोग नहीं करता।/हे (जो सॉकेट भी शामिल है) question मैं पोस्ट में link के अनुसार, libeio सब POSIX मैं के साथ काम कर कार्य का समर्थन करता है: देखें here

    स्पष्टीकरण। लेकिन नोड लेखक ने इसे केवल एसिंक फ़ाइल I/O के लिए उपयोग करने का निर्णय लिया, और नेटवर्क I/O के लिए libev का उपयोग करता है। मैं नहीं जानता कि आपने इसे कहाँ से सुना है लेकिन आप नियमित फ़ाइलों पर एपोल का उपयोग कर सकते हैं।

  3. libev इसलिए यहाँ कोई समस्या नहीं घटना पाश का उपयोग करता है।

  4. हाँ IOCP संभालती async मैं/खिड़कियों में हे, कर्नेल धागा पूल का उपयोग करता है।
  5. नई लिनक्स कर्नेल epoll, नई BSD कर्नेल में kqueue है। libev और libeio linux पर्यावरण के लिए थे और घटना पाश/आईओ async सभी गिरी लिए प्रदान करता है (समर्थन करता है, का चयन करें, चुनाव, epoll, kqueue)।

अद्यतन सवाल:

  1. ज्यादा के बारे में libuv
  2. शायद पर्याप्त पता है न (नहीं जानता)
  3. यहाँ Windows 8 पर मेरी निष्कर्ष हैं, प्रोसेस एक्सप्लोरर के माध्यम से यह जाँच। एक नोड आवेदन प्रक्रिया के लिए 4 धागे, 1 डीएलएल, 1 फ़ाइल और 1 अनुभाग (कुल 7 प्रविष्टियां) दिखाया गया।

  4. ps -eLf दिखाने के सभी थ्रेड्स और प्रक्रियाओं करता है, हो सकता है आप अधिक-छानने यह, बस ps -eLf | grep x तरह नोड प्रक्रिया पीआईडी ​​जहां x नोड प्रक्रिया के लिए पीआईडी ​​है देखने के लिए कर रहे हैं।

+0

धन्यवाद। मैंने 'ps -eLf | की कोशिश की grep pid', अभी भी वही आउटपुट –

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