नोड.जेएस पर समवर्ती कार्यों के लिए कौन सा बेहतर होगा? रेशे? वेब कार्यकर्ता? या धागे?


111

मैंने कुछ समय पहले नोड.जेएस पर ठोकर खाई और इसे बहुत पसंद किया। लेकिन जल्द ही मुझे पता चला कि इसमें सीपीयू-गहन कार्यों को करने की क्षमता का बुरी तरह से अभाव था। इसलिए, मैंने गुग्लिंग शुरू कर दिया और समस्या को हल करने के लिए इन उत्तरों को मिला: फाइबर्स, वेबवर्क और थ्रेड्स (थ्रेड-ए-गोगो)। अब कौन सा उपयोग करना एक भ्रम है और उनमें से एक को निश्चित रूप से उपयोग करने की आवश्यकता है - आखिरकार एक सर्वर होने का उद्देश्य क्या है जो सिर्फ IO में अच्छा है और कुछ नहीं? सुझाव चाहिए!

अपडेट करें:

मैं एक तरह से ऑफ-लेट सोच रहा था; इस पर सिर्फ सुझाव की जरूरत है। अब, जो मैंने सोचा था कि यह था: चलो कुछ धागे हैं (थ्रेड_ए_गोगो या शायद वेबवर्क का उपयोग करके)। अब, जब हमें उनकी अधिक आवश्यकता होगी, हम और अधिक बना सकते हैं। लेकिन निर्माण प्रक्रिया पर कुछ सीमा होगी। (सिस्टम द्वारा निहित नहीं है, लेकिन शायद ओवरहेड के कारण)। अब, जब हम सीमा से अधिक हो जाते हैं, तो हम एक नया नोड कांटा कर सकते हैं, और उस पर धागे बनाना शुरू कर सकते हैं। इस तरह, यह तब तक चल सकता है जब तक हम कुछ सीमा तक नहीं पहुंच जाते हैं (आखिरकार, प्रक्रियाओं में भी एक बड़ा ओवरहेड होता है)। जब यह सीमा पूरी हो जाती है, तो हम कार्यों की कतार बनाना शुरू कर देते हैं। जब भी कोई धागा मुक्त हो जाएगा, उसे एक नया कार्य सौंपा जाएगा। इस तरह, यह आसानी से चल सकता है।

तो, मैं यही सोचता था। क्या यह विचार अच्छा है? मैं इस प्रक्रिया और थ्रेड्स सामान के लिए थोड़ा नया हूँ, इसलिए इसमें कोई विशेषज्ञता नहीं है। कृपया अपनी राय साझा करें।

धन्यवाद। :)


कृपया ध्यान दें: श्रमिक एक ब्राउज़र विनिर्देश हैं - एक जावास्क्रिप्ट सुविधा नहीं।
फ्रेडTheWebGuy

खैर, मैं देख रहा हूँ। मेरा सवाल नोड.जेएस के बारे में था - सर्वर कोड और क्लाइंट साइड के बारे में नहीं!
पार्थ ठक्कर

बस एक स्पष्टीकरण- मैं देख रहा हूं कि मूल प्रश्न NodeJs में वेबवर्क के बारे में था, जो असंभव है- NodeJs "थ्रेड्स" का उपयोग करता है। हालाँकि, एक NodeJS मॉड्यूल है जो कि NodeJs रनटाइम के भीतर WebWorker सिंटैक्स की अनुमति देता है।
फ्रेडइनवेब्युय

जवाबों:


331

नोड के पास एक पूरी तरह से अलग प्रतिमान है और एक बार इसे सही ढंग से कैप्चर करने के बाद, समस्याओं को हल करने के इस अलग तरीके को देखना आसान है। आपको नोड एप्लिकेशन (1) में कई थ्रेड्स की आवश्यकता नहीं है क्योंकि आपके पास एक ही काम करने का एक अलग तरीका है। आप कई प्रक्रियाएँ बनाते हैं; लेकिन यह तुलना में बहुत अलग है, उदाहरण के लिए Apache Web Server का Prefork mpm कैसे करता है।

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

- अरे, हसन, मुझे लगता है कि आप मेरे दादा के समय से एक नौसिखिया या बहुत पुराने स्कूल हैं !!! आप कुछ धागे क्यों नहीं बनाते हैं और इसे बहुत तेज़ बनाते हैं?

- ओह, हमारे पास केवल एक सीपीयू कोर है।

-- तो क्या? कुछ थ्रेड मैन बनाएं, इसे तेज करें!

- यह उस तरह काम नहीं करता है। अगर मैं धागे बनाऊं तो मैं इसे धीमा कर दूंगा। क्योंकि मैं थ्रेड्स के बीच स्विच करने के लिए सिस्टम में बहुत अधिक ओवरहेड जोड़ रहा हूं, उन्हें थोड़ी देर देने की कोशिश कर रहा हूं, और मेरी प्रक्रिया के अंदर, इन थ्रेड्स के बीच संवाद करने की कोशिश कर रहा हूं। इन सभी तथ्यों के अलावा, मुझे यह भी सोचना होगा कि मैं किसी एक काम को कई टुकड़ों में कैसे विभाजित करूँगा जो समानांतर में किया जा सकता है।

- ठीक है ठीक है, मैं देख रहा हूं कि आप गरीब हैं। चलो मेरे कंप्यूटर का उपयोग करें, इसमें 32 कोर हैं!

- वाह, आप मेरे प्यारे दोस्त हैं, बहुत-बहुत धन्यवाद। मैं इसकी सराहना करता हूं!

फिर हम काम पर वापस लौटते हैं। अब हमारे पास अपने अमीर दोस्त की बदौलत 32 सीपीयू कोर हैं। हमें नियमों का पालन करना होगा बस बदल गया है। अब हम अपने द्वारा दिए गए इस धन का उपयोग करना चाहते हैं।

एकाधिक कोर का उपयोग करने के लिए, हमें अपने काम को टुकड़ों में विभाजित करने का एक तरीका खोजने की आवश्यकता है जिसे हम समानांतर में संभाल सकते हैं। यदि यह नोड नहीं था, तो हम इसके लिए थ्रेड्स का उपयोग करेंगे; 32 धागे, प्रत्येक सीपीयू कोर के लिए एक। हालाँकि, चूंकि हमारे पास नोड है, हम 32 नोड प्रक्रियाएँ बनाएंगे।

थ्रेड्स नोड प्रक्रियाओं का एक अच्छा विकल्प हो सकता है, शायद एक बेहतर तरीका भी; लेकिन केवल एक विशिष्ट प्रकार की नौकरी में, जहां काम पहले से ही परिभाषित है और हमें इस पर पूरा नियंत्रण है कि इसे कैसे संभालना है। इसके अलावा, हर दूसरी तरह की समस्या के लिए जहां नौकरी एक तरह से बाहर से आती है पर हमारा नियंत्रण नहीं होता है और हम जल्द से जल्द जवाब देना चाहते हैं, नोड का तरीका बहुत बेहतर है।

- अरे, हसन, क्या आप अभी भी सिंगल-थ्रेडेड काम कर रहे हैं? तुममें क्या खराबी है, यार? मैंने आपको वही प्रदान किया है जो आप चाहते थे। आपके पास अब कोई बहाना नहीं है। धागे बनाएँ, इसे तेज चलाएं।

- मैंने काम को टुकड़ों में विभाजित किया है और हर प्रक्रिया समानांतर में इनमें से किसी एक टुकड़े पर काम करेगी।

- आप थ्रेड्स क्यों नहीं बनाते हैं?

- क्षमा करें, मुझे नहीं लगता कि यह प्रयोग करने योग्य है। आप चाहें तो अपना कंप्यूटर ले सकते हैं

- नहीं ठीक है, मैं शांत हूँ, मुझे समझ में नहीं आता कि आप थ्रेड्स का उपयोग क्यों नहीं करते हैं?

- कंप्यूटर के लिए धन्यवाद। :) मैंने पहले से ही काम को टुकड़ों में विभाजित किया है और मैं इन टुकड़ों पर समानांतर में काम करने के लिए प्रक्रियाएं बनाता हूं। सभी सीपीयू कोर का पूरा उपयोग किया जाएगा। मैं प्रक्रियाओं के बजाय थ्रेड्स के साथ ऐसा कर सकता था; लेकिन नोड के पास यह तरीका है और मेरे बॉस पार्थ ठक्कर चाहते हैं कि मैं नोड का इस्तेमाल करूं।

- ठीक है, मुझे बताएं कि क्या आपको दूसरे कंप्यूटर की आवश्यकता है। : p

यदि मैं 32 के बजाय 33 प्रक्रियाएं बनाता हूं, तो ऑपरेटिंग सिस्टम का शेड्यूलर एक थ्रेड को रोक देगा, दूसरे को शुरू करें, इसे कुछ चक्रों के बाद रोकें, दूसरे को फिर से शुरू करें ... यह अनावश्यक ओवरहेड है। मैं यह नहीं चाहता। वास्तव में, 32 कोर वाली प्रणाली पर, मैं वास्तव में 32 प्रक्रियाएँ बनाना नहीं चाहूंगा, 31 हो सकते हैं अच्छे । क्योंकि यह सिर्फ मेरा आवेदन नहीं है जो इस प्रणाली पर काम करेगा। अन्य चीजों के लिए थोड़ा कमरा छोड़ना अच्छा हो सकता है, खासकर अगर हमारे पास 32 कमरे हैं।

मेरा मानना ​​है कि हम सीपीयू-गहन कार्यों के लिए प्रोसेसर का पूरी तरह से उपयोग करने के बारे में अब उसी पृष्ठ पर हैं

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

- कोई चिंता नहीं, मैं शांत हूं। हर कोई इन चीजों को कहता है इसलिए मुझे लगता है कि मैं उन्हें सुनने के आदी हूं।

-- इसलिए? इसके लिए नोड अच्छा नहीं है?

- नोड इसके लिए पूरी तरह से अच्छा है, हालांकि थ्रेड्स भी अच्छे हो सकते हैं। धागा / प्रक्रिया निर्माण उपरि के लिए के रूप में; उन चीजों पर जो आप बहुत दोहराते हैं, हर मिलीसेकंड मायने रखता है। हालाँकि, मैं केवल 32 प्रक्रियाएँ बनाता हूँ और इसमें थोड़ा समय लगेगा। यह केवल एक बार ही होगा। इससे कोई फर्क नहीं पड़ेगा।

- जब मैं हजारों धागे बनाना चाहता हूं, तब?

- आप कभी हजारों सूत्र नहीं बनाना चाहते। हालाँकि, एक ऐसे सिस्टम पर जो काम कर रहा है जो बाहर से आता है, जैसे HTTP अनुरोधों को संसाधित करने वाला वेब सर्वर; यदि आप प्रत्येक अनुरोध के लिए एक धागे का उपयोग कर रहे हैं, तो आप बहुत सारे धागे बना रहे होंगे, उनमें से कई।

- नोड अलग है, हालांकि? सही?

-- हाँ बिल्कुल। यह वह जगह है जहाँ नोड वास्तव में चमकता है। जैसे एक प्रक्रिया की तुलना में एक धागा बहुत हल्का होता है, एक फ़ंक्शन कॉल एक धागे की तुलना में बहुत हल्का होता है। थ्रेड बनाने के बजाय नोड कॉल फ़ंक्शन करता है। वेब सर्वर के उदाहरण में, प्रत्येक आने वाला अनुरोध फ़ंक्शन कॉल का कारण बनता है।

-- हां दिलचस्प; लेकिन आप एक ही समय में एक फ़ंक्शन चला सकते हैं यदि आप कई थ्रेड का उपयोग नहीं कर रहे हैं। जब एक ही समय में वेब सर्वर पर बहुत सारे अनुरोध आते हैं तो यह कैसे काम कर सकता है?

- आप पूरी तरह से सही हैं कि फ़ंक्शन कैसे चलते हैं, एक बार में, दो समानांतर में कभी नहीं। मेरा मतलब है कि एक ही प्रक्रिया में, एक समय में कोड का केवल एक क्षेत्र चल रहा है। ओएस शेड्यूलर नहीं आता है और इस फ़ंक्शन को रोक देता है और किसी अन्य पर स्विच करता है, जब तक कि यह हमारी प्रक्रिया में किसी अन्य थ्रेड को नहीं, किसी अन्य प्रक्रिया को समय देने की प्रक्रिया को रोक देता है। (2)

- फिर एक समय में एक प्रक्रिया 2 अनुरोधों को कैसे संभाल सकती है?

- एक प्रक्रिया एक समय में हजारों अनुरोधों को संभाल सकती है जब तक कि हमारे सिस्टम में पर्याप्त संसाधन (रैम, नेटवर्क, आदि) हैं। उन कार्यों को कैसे चलाया जाता है प्रमुख कुंजी है।

- हम्म, क्या मुझे अब उत्साहित होना चाहिए?

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

- यह बहुत जटिल लगता है?

- नहीं, मैं जटिल लग सकता है; लेकिन सिस्टम ही बहुत सरल है और यह सही समझ में आता है।

अब मैं इन दोनों डेवलपर्स के बीच संवाद का हवाला देते हुए रोकना चाहता हूं और इन कार्यों को कैसे काम करता हूं इसका एक अंतिम त्वरित उदाहरण के बाद अपना जवाब समाप्त करता हूं।

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

नीचे एक सरल उदाहरण है जहां हम एक फ़ाइल खोलते हैं और इसे डेटा पर कुछ काम करने के लिए पढ़ते हैं।

तुल्यकालिक तरीका:

Open File
Repeat This:    
    Read Some
    Do the work

अतुल्यकालिक तरीका:

Open File and Do this when it is ready: // Our function returns
    Repeat this:
        Read Some and when it is ready: // Returns again
            Do some work

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

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


(1) जब तक आप C / C ++ जैसी अन्य भाषाओं में पुस्तकालयों का निर्माण नहीं कर रहे हैं, उस स्थिति में आप अभी भी नौकरियों को विभाजित करने के लिए सूत्र नहीं बनाते हैं। इस तरह के काम के लिए आपके पास दो धागे हैं जिनमें से एक में नोड के साथ संचार जारी रहेगा जबकि दूसरा वास्तविक कार्य करता है।

(२) वास्तव में, प्रत्येक नोड प्रक्रिया में पहले फुटनोट में उल्लिखित समान कारणों के लिए कई सूत्र हैं। हालाँकि यह कोई ऐसा तरीका नहीं है जैसे 1000 धागे समान कार्य करते हैं। वे अतिरिक्त धागे IO ईवेंट्स को स्वीकार करने और इंटर-प्रोसेस मैसेजिंग को संभालने जैसी चीजों के लिए हैं।

अद्यतन (टिप्पणियों में एक अच्छे प्रश्न के उत्तर के रूप में)

@ मर्क, रचनात्मक आलोचना के लिए धन्यवाद। नोड के प्रतिमान में, आपको कभी भी ऐसे कार्य नहीं करने चाहिए जो प्रक्रिया में बहुत समय लेते हैं जब तक कि कतार में अन्य सभी कॉल को एक के बाद एक चलाने के लिए डिज़ाइन नहीं किया गया हो। कम्प्यूटेशनल रूप से महंगे कार्यों के मामले में, यदि हम पूरी तरह से तस्वीर को देखते हैं, तो हम देखते हैं कि यह "क्या हमें धागे या प्रक्रियाओं का उपयोग नहीं करना चाहिए?" लेकिन एक सवाल "हम इन कार्यों को अच्छी तरह से संतुलित तरीके से उप-कार्यों में कैसे विभाजित कर सकते हैं कि हम उन्हें सिस्टम पर कई सीपीयू कोर के समानांतर रोजगार में चला सकते हैं?" मान लें कि हम 8 कोर के साथ एक सिस्टम पर 400 वीडियो फ़ाइलों को संसाधित करेंगे। यदि हम एक बार में एक फ़ाइल को संसाधित करना चाहते हैं, तो हमें एक ऐसी प्रणाली की आवश्यकता होती है जो एक ही फ़ाइल के विभिन्न भागों को संसाधित करेगी, जिस स्थिति में, शायद, एक बहु-थ्रेडेड एकल-प्रक्रिया प्रणाली का निर्माण करना आसान होगा और इससे भी अधिक कुशल। राज्य-साझाकरण / संचार आवश्यक होने पर हम कई प्रक्रियाओं को चलाकर और उनके बीच संदेश भेजकर इसके लिए नोड का उपयोग कर सकते हैं। जैसा कि मैंने पहले कहा, नोड के साथ एक बहु-प्रक्रिया दृष्टिकोण हैसाथ ही के रूप में कार्य के इस प्रकार में एक बहु लड़ी दृष्टिकोण; लेकिन इससे ज्यादा नहीं। फिर से, जैसा कि मैंने पहले बताया, नोड की चमक तब होती है जब हमारे पास ये कार्य कई स्रोतों से सिस्टम में इनपुट के रूप में आते हैं क्योंकि कई कनेक्शन समवर्ती रूप से नोड में थ्रेड-प्रति-कनेक्शन या प्रक्रिया-प्रति-कनेक्शन की तुलना में बहुत हल्के होते हैं प्रणाली।

setTimeout(...,0)कॉल के लिए के रूप में ; कभी-कभी कतार में कॉल की अनुमति देने के लिए एक समय लेने वाले कार्य के दौरान एक ब्रेक देने से उनके प्रसंस्करण की हिस्सेदारी की आवश्यकता हो सकती है। विभिन्न तरीकों से विभाजित कार्य आपको इनसे बचा सकते हैं; लेकिन फिर भी, यह वास्तव में हैक नहीं है, यह सिर्फ इवेंट कतारों का काम है। इसके अलावा, process.nextTickइस उद्देश्य के लिए उपयोग करना तब से बेहतर है जब आप उपयोग करते हैं setTimeout, गणना और पारित किए गए समय की जांच आवश्यक होगी, जबकि process.nextTickहम वास्तव में यही चाहते हैं: "अरे काम, कतार के अंत में वापस जाओ, आपने अपने हिस्से का उपयोग किया है! "


9
गजब का! बहुत बढ़िया! जिस तरह से आपने इस सवाल का जवाब दिया मुझे बहुत अच्छा लगा! :)
पार्थ ठक्कर

48
निश्चित रूप से :) मैं वास्तव में विश्वास नहीं कर सकता हूँ कि इस उत्तर-लेख को वोट करने वाले लोग बहुत मतलबी हैं! प्रश्नकर्ता इसे "लानत कमाल!" और एक पुस्तक लेखक मुझे यह देखने के बाद अपनी वेबसाइट पर लिखने की पेशकश करता है; लेकिन कुछ प्रतिभाशाली लोग इसे नीचे वोट देते हैं। आप अपनी चमकदार बौद्धिक गुणवत्ता क्यों नहीं साझा करते हैं और मतलबी और चुपके-चुपके वोट देने के बजाय उस पर टिप्पणी करते हैं, हुह? क्यों कुछ अच्छा आपको परेशान करता है? आप अन्य लोगों तक पहुंचने के लिए कुछ उपयोगी को क्यों रोकना चाहते हैं जो वास्तव में इसका लाभ उठा सकते हैं?
हैन्यासिन

9
यह पूरी तरह से उचित जवाब नहीं है। कम्प्यूटेशनल रूप से महंगे कार्यों के बारे में, जहां हम अपने फ़ंक्शन को "जल्दी से समाप्त" नहीं कर सकते हैं? मेरा मानना ​​है कि कुछ लोग इसके लिए कुछ setTimeout(...,0)हैक का उपयोग करते हैं, लेकिन इस परिदृश्य में एक अलग धागे का उपयोग करना निश्चित रूप से बेहतर होगा?
मप्र

3
@hasanyasin यह नोड पर सबसे अच्छा स्पष्टीकरण है जो मैंने अब तक पाया है! :)
वेनेमो

7
@ आम तौर पर, यदि यह कम्प्यूटेशनल रूप से महंगा है, तो ट्रेड / प्रोसेस वर्कर्स के लिए विकल्प / मॉड्यूल हैं ... सामान्य तौर पर इस प्रकार की चीजों के लिए, मैं एक संदेश कतार का उपयोग करता हूं, और कार्यकर्ता प्रक्रिया (ईएस) है जो एक कार्य को संभालती है कतार से समय, और उस कार्य को पूरा करें। यह कई सर्वरों को स्केल करने की भी अनुमति देता है। इन पंक्तियों के साथ, सबटैक में बहुत सारे मॉड्यूल हैं जो प्रावधान और स्केलिंग पर निर्देशित हैं जिन्हें आप देख सकते हैं।
ट्रैकर 1

34

(अपडेट 2016: वेब कर्मचारी io.js में जा रहे हैं - एक Node.js कांटा Node.js v7 - नीचे देखें।)

(अपडेट 2017: वेब कर्मचारी Node.js v7 या v8 में नहीं जा रहे हैं - नीचे देखें।)

(अपडेट 2018: वेब कार्यकर्ता Node.js Node v10.5.0 में जा रहे हैं - नीचे देखें।)

कुछ स्पष्टीकरण

ऊपर दिए गए जवाबों को पढ़ने के बाद, मैं यह बताना चाहूंगा कि वेब कर्मचारियों में ऐसा कुछ भी नहीं है जो सामान्य रूप से जावास्क्रिप्ट के दर्शन के खिलाफ हो और विशेष रूप से संक्षिप्तता के संबंध में नोड। (यदि वहाँ था, तो यह WHATWG द्वारा भी चर्चा नहीं की जाएगी, ब्राउज़रों में बहुत कम लागू की गई है)।

आप एक वेब कार्यकर्ता को एक हल्के माइक्रोसर्विस के रूप में सोच सकते हैं जिसे अतुल्यकालिक रूप से एक्सेस किया जाता है। कोई राज्य साझा नहीं है। कोई लॉकिंग समस्या मौजूद नहीं है। कोई अवरोध नहीं है। कोई सिंक्रनाइज़ेशन की आवश्यकता है। ऐसे ही जब आप अपने नोड प्रोग्राम से एक RESTful सेवा का उपयोग करते हैं, तो आप चिंता न करें कि यह अब "मल्टीथ्रेडेड" है क्योंकि Restful सर्विस आपके स्वयं के ईवेंट लूप के समान थ्रेड में नहीं है। यह सिर्फ एक अलग सेवा है जिसे आप एसिंक्रोनस रूप से एक्सेस करते हैं और यही मायने रखता है।

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

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

लेकिन वेब कर्मचारियों को थ्रेड्स का उपयोग करने की आवश्यकता नहीं है। जब तक वेब वर्कर API का उपयोग नहीं किया जाता है तब तक आप प्रक्रियाओं, हरे रंग के धागों या यहां तक ​​कि RESTful सेवाओं का उपयोग कर सकते हैं। वैल्यू सिमेन्टिक्स के जरिए कॉल पासिंग एपीआई की पूरी सुंदरता यह है कि अंतर्निहित कार्यान्वयन बहुत अधिक अप्रासंगिक है, क्योंकि संगामिति मॉडल का विवरण उजागर नहीं होगा।

एक एकल-थ्रेडेड ईवेंट लूप I / O- बाउंड ऑपरेशन के लिए एकदम सही है। यह सीपीयू-बाउंड संचालन के लिए अच्छी तरह से काम नहीं करता है, खासकर लंबे समय तक चलने वाले। इसके लिए हमें अधिक प्रक्रियाओं को स्पॉन करने या थ्रेड्स का उपयोग करने की आवश्यकता है। बाल प्रक्रियाओं का प्रबंधन और एक पोर्टेबल तरीके से अंतर-प्रक्रिया संचार काफी कठिन हो सकता है और इसे अक्सर साधारण कार्यों के लिए एक ओवरकिल के रूप में देखा जाता है, जबकि थ्रेड्स का उपयोग करने का मतलब है ताले और सिंक्रनाइज़ेशन मुद्दों से निपटना जो सही करना बहुत मुश्किल है।

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

मैं इसे उन टिप्पणियों को स्पष्ट करने के लिए लिख रहा हूं जो मूल रूप से कह रहे थे कि वेब श्रमिकों को ब्राउज़र के लिए बनाया गया था, न कि सर्वर (यह भूलकर कि इसे जावास्क्रिप्ट में बहुत अधिक सब कुछ के बारे में कहा जा सकता है)।

नोड मॉड्यूल

ऐसे कुछ मॉड्यूल हैं जो वेब वर्कर्स को नोड में जोड़ने वाले हैं:

मैंने उनमें से किसी का भी उपयोग नहीं किया है, लेकिन मेरे पास दो त्वरित अवलोकन हैं जो प्रासंगिक हो सकते हैं: मार्च 2015 तक, नोड-वेबवर्क को अंतिम बार 4 साल पहले अपडेट किया गया था और नोड-वेबवर्क-थ्रेड्स को एक महीने पहले अंतिम रूप से अपडेट किया गया था। इसके अलावा, मैं नोड-वेबवर्क-थ्रेड्स उपयोग के उदाहरण में देखता हूं कि आप वर्कर कंस्ट्रक्टर के तर्क के रूप में फ़ाइल नाम के बजाय एक फ़ंक्शन का उपयोग कर सकते हैं जो ऐसा लगता है कि सूक्ष्म समस्याओं का कारण बन सकता है यदि यह थ्रेड्स का उपयोग करके मेमोरी को साझा करता है (जब तक कि मेमोरी साझा न हो फ़ंक्शंस का उपयोग केवल इसके .toString () विधि के लिए किया जाता है और अन्यथा इसे अलग वातावरण में संकलित किया जाता है, जिस स्थिति में यह ठीक हो सकता है - मुझे इसमें अधिक गहराई से देखना होगा, बस यहाँ अपनी टिप्पणियों को साझा करना होगा)।

यदि कोई अन्य प्रासंगिक परियोजना है जो नोड में वेब कार्यकर्ता एपीआई को लागू करती है, तो कृपया एक टिप्पणी छोड़ दें।

अपडेट १

यह लिखने के समय मुझे अभी तक पता नहीं था लेकिन संयोग से एक दिन पहले मैंने यह उत्तर लिखा था कि वेब वर्कर्स को io.js में जोड़ा गया था

( io.js Node.js का एक कांटा है - देखें: io.js ने अधिक जानकारी के लिए मिकेल रोजर्स के साथ एक इन्फोवर्ल्ड साक्षात्कार Node.js को कांटा बनाने का फैसला किया ।)

यह न केवल इस बात को साबित करता है कि वेब वर्करों में कुछ भी नहीं है जो सामान्य रूप से जावास्क्रिप्ट के दर्शन के खिलाफ है और विशेष रूप से संगोष्ठी के संबंध में नोड है, लेकिन इसका परिणाम हो सकता है कि वेब कर्मचारियों को सर्वर साइड जावास्क्रिप्ट में प्रथम श्रेणी का नागरिक होना चाहिए जैसे io। js (और संभवतः भविष्य में Node.js), जैसा कि पहले से ही सभी आधुनिक ब्राउज़रों में क्लाइंट-साइड जावास्क्रिप्ट में है

अपडेट २

अपडेट 1 और मेरे ट्वीट में मैं io.js पुल अनुरोध # 1159 का जिक्र कर रहा था जो अब नोड पीआर # 1159 पर पुनर्निर्देशित करता है जो 8 जुलाई को बंद था और इसे नोड पीआर # 2133 के साथ बदल दिया गया था - जो अभी भी खुला है। उन पुल अनुरोधों के तहत कुछ चर्चा हो रही है जो io.js / Node.js में वेब श्रमिकों की स्थिति के बारे में कुछ और जानकारी प्रदान कर सकती हैं।

अपडेट ३

नवीनतम जानकारी - टिप्पणी में इसे पोस्ट करने के लिए NiCk न्यूमैन के लिए धन्यवाद: श्रमिक है: सितंबर 6, 2015 से पेटका एंटोनोव द्वारा प्रारंभिक कार्यान्वयन प्रतिबद्ध है जिसे इस पेड़ में डाउनलोड और आज़माया जा सकता है । विवरण के लिए NiCk Newman द्वारा टिप्पणियां देखें ।

अद्यतन ४

के रूप में मई वर्ष 2016 पर अभी भी खुला पिछले टिप्पणियों पीआर # 2133 - श्रमिकों: प्रारंभिक कार्यान्वयन 3 महीने के थे। 30 मई को मैथ्यूस मोरेरा ने मुझे नीचे दिए गए टिप्पणियों में इस उत्तर के लिए एक अद्यतन पोस्ट करने के लिए कहा और उन्होंने पीआर टिप्पणियों में इस सुविधा की वर्तमान स्थिति के लिए कहा

पीआर चर्चा में पहले उत्तर पर संदेह किया गया था, लेकिन बाद में बेन नूरुधिस ने लिखा था कि "यह एक आकार में विलय हो गया है या दूसरे v7 के लिए मेरी टूडू सूची में है"।

अन्य सभी टिप्पणियां दूसरी लगती थीं और जुलाई 2016 तक ऐसा लगता है कि वेब वर्कर्स को नोड के अगले संस्करण में उपलब्ध होना चाहिए , संस्करण 7.0 जिसे अक्टूबर 2016 को रिलीज़ करने की योजना है (जरूरी नहीं कि यह सटीक पीआर के रूप में हो)।

इसे टिप्पणियों में इंगित करने और गीथहब पर चर्चा को पुनर्जीवित करने के लिए माथियस मोरेरा का धन्यवाद।

अद्यतन ५

के रूप में जुलाई वर्ष 2016 प्रासंगिक मॉड्यूल, खोज की एक पूरी सूची के लिए - वहाँ NPM पर कुछ मॉड्यूल है कि पहले उपलब्ध नहीं थे NPM श्रमिकों के लिए, वेब श्रमिकों, आदि विशेष रूप से कुछ भी करता है या आप के लिए काम नहीं करता है, एक पोस्ट करें टिप्पणी।

अद्यतन ६

के रूप में जनवरी 2017 में यह संभावना नहीं है कि वेब श्रमिकों Node.js. में विलय कर दिया जाएगा

पुल अनुरोध # 2133 कार्यकर्ता: 8 जुलाई, 2015 से पेटका एंटोनोव द्वारा प्रारंभिक कार्यान्वयन , 11 दिसंबर, 2016 को बेन नोरोधिस द्वारा बंद कर दिया गया था , जिन्होंने टिप्पणी की थी कि "मल्टी-थ्रेडिंग समर्थन पर्याप्त लाभ नहीं होने के लिए कई नए विफलता मोड जोड़ता है" और "हम" यह भी साझा स्मृति और अधिक कुशल क्रमांकन की तरह अधिक पारंपरिक साधनों का उपयोग कर पूरा कर सकते हैं।

अधिक जानकारी के लिए GitHub पर PR 2133 की टिप्पणियाँ देखें ।

टिप्पणी में इसे इंगित करने के लिए मैथ्यूस मोरेरा को फिर से धन्यवाद।

अद्यतन ६

मुझे यह घोषणा करते हुए खुशी हो रही है कि कुछ दिनों पहले, जून 2018 में वेब कार्यकर्ता Node v10.5.0 में --experimental-workerध्वज के साथ एक प्रयोगात्मक विशेषता के रूप में दिखाई दिए ।

अधिक जानकारी के लिए, देखें:

🎉🎉🎉 अंत में! मैं अपने 3 साल पुराने स्टैक ओवरफ्लो जवाब में 7 वें अपडेट कर सकता हूं, जहां मैं तर्क देता हूं कि एक ला वेब कर्मचारियों को फैलाना नोड दर्शन के खिलाफ नहीं है, केवल इस बार यह कहते हुए कि हमें आखिरकार मिल गया! 😜👍


1
@NiCkNewman धन्यवाद। मैं देखता हूं कि io.js में मूल पुल अनुरोध अब बंद हो गया है और इसे दूसरे के साथ बदल दिया गया है - GitHub पर टिप्पणी अनुरोधों में कुछ चर्चा के साथ, शायद आप वहां कुछ जानकारी पा सकेंगे। देखें: मेरे उत्तर में अपडेट २।
आरपी

1
हां, ऐसा लग रहा है कि उन्होंने सिर्फ आखिरी लिब्यु इश्यू तय किया है। मुझे आश्चर्य है कि जब मैं मॉड्यूल पर अपने हाथ पा सकता हूं। इंतजार नहीं कर सकता! हमें अपडेट रखने के लिए धन्यवाद ~ संपादित करें: बस आरंभ किया गया: github.com/petkaantonov/io.js/commit/… वहाँ हम चलते हैं, यह आ रहा है!
नीक न्यूमैन

1
हाँ, यह जीना है। (आधिकारिक तौर पर अभी तक लागू नहीं हुआ है), लेकिन आप यहां स्रोत डाउनलोड कर सकते हैं: github.com/petkaantonov/io.js/tree/… और यदि आप इसका परीक्षण करना चाहते हैं तो संकलित करें! अब मैं इसे कर रहा हूँ ~
NiCk Newman

1
@NiCkNewman नई जानकारी के लिए धन्यवाद - मैंने इसे उत्तर में जोड़ा।
आरपी

1
क्या आप हमें Node.js workersकार्यान्वयन की स्थिति पर अपडेट कर सकते हैं ? PR # 2133 में नवीनतम टिप्पणियाँ फरवरी से हैं; डेवलपर्स स्पष्ट रूप से एक समस्या में भाग गए और कोई टिप्पणी नहीं है जिससे यह संकेत मिलता है कि यह हल हो गया है।
मैथ्यूस मोरेरा

8

मैं विचार के पुराने स्कूल से आता हूं जहां हमने सॉफ्टवेयर को तेज बनाने के लिए मल्टी-थ्रेडिंग का इस्तेमाल किया। पिछले 3 वर्षों से मैं Node.js और इसके एक बड़े समर्थक का उपयोग कर रहा हूं। जैसा कि हैनानसिन ने विस्तार से बताया है कि नोड कैसे काम करता है और एसिंक्रोनस कार्यक्षमता की अवधारणा। लेकिन मुझे यहां कुछ चीजें जोड़ने दें।

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

तो जैसे यह या थ्रेड सिग्नल नहीं है या मल्टी-कोर या सिंगल कोर नहीं है, आपकी प्रक्रियाएं ओएस द्वारा कटा हुआ समय और पूर्ववत की जाएंगी।

Nodejs एक एकल प्रक्रिया है और async तंत्र प्रदान करता है। जब हम कार्य समाप्त करने के लिए इवेंट लूप में प्रतीक्षा कर रहे हैं, तो यहां कार्य करने के लिए झूठ बोलने वाले ओएस के तहत नौकरियों को भेजा जाता है। एक बार जब हमें OS से हरी झंडी मिल जाती है तो हम वह प्रदर्शन करते हैं जो हमें कभी करने की आवश्यकता होती है। अब एक तरह से यह सहकारी / गैर-बहुआयामी मल्टी-टास्किंग है, इसलिए हमें कभी भी इवेंट लूप को बहुत लंबे समय के लिए ब्लॉक नहीं करना चाहिए, अन्य वार जब हम अपने आवेदन को बहुत तेजी से कम कर देंगे।
इसलिए अगर कभी कोई ऐसा कार्य होता है जो प्रकृति में अवरुद्ध हो रहा है या बहुत समय लगता है तो हमें इसे ओएस और थ्रेड्स की पूर्वगामी दुनिया में शाखा देना होगा। इस बात के अच्छे उदाहरण हैं कि लिबवू दस्तावेज में है । इसके अलावा, यदि आप प्रलेखन को पढ़ते हैं तो आप पाते हैं कि FileI / O को नोड में नोड्स में संभाला जाता है

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

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

मुझे पता है कि हसायनसिन का उत्तर स्वीकार कर लिया गया है, लेकिन मेरे लिए थ्रेड्स का कोई फर्क नहीं पड़ेगा कि आप क्या कहते हैं या आप उन्हें स्क्रिप्ट के पीछे कैसे छिपाते हैं, दूसरी बात यह है कि कोई भी चीज़ों को सिर्फ थ्रेड्स में नहीं तोड़ता है गति के लिए यह ज्यादातर अवरुद्ध कार्यों के लिए किया जाता है। और धागे Node.js की पिछली हड्डी में होते हैं इसलिए पूरी तरह से मल्टी-थ्रेडिंग को सही करने से पहले। इसके अलावा धागे प्रक्रियाओं से भिन्न होते हैं और प्रति कोर नोड प्रक्रिया होने की सीमा वास्तव में धागे की संख्या पर लागू नहीं होती है, धागे एक प्रक्रिया के लिए उप कार्यों की तरह हैं। वास्तव में थ्रेड जीते गए; अपने विंडोज़ टास्क मैनेजर या लिनक्स टॉप कमांड में नहीं दिखें। एक बार फिर उनका वजन बहुत कम होता है, फिर प्रक्रिया होती है


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

मुझे लगता है कि जो प्रमुख बिंदु हमें याद आ रहा है, वह यह है कि ओएस के तहत प्रक्रिया हमेशा निष्पक्षता प्रदान करने के लिए एक प्रारंभिक तरीके से की जाएगी। मल्टी प्रोसेसर के साथ आप वास्तविक समानांतर कोड निष्पादन कर सकते हैं, लेकिन तब भी आपके पास प्रीमेशन होगा। एसिंक्रोनस काम भी ओएस द्वारा कुछ प्रक्रिया के लिए किया जाता है।
limplash

4

मुझे यकीन नहीं है कि अगर वेबवर्क इस मामले में प्रासंगिक हैं, तो वे क्लाइंट-साइड तकनीक (ब्राउज़र में रन) हैं, जबकि नोड.जेएस सर्वर पर चलता है। फाइबर, जहां तक ​​मैं समझता हूं, वे भी अवरुद्ध कर रहे हैं, यानी वे स्वैच्छिक मल्टीटास्किंग हैं, इसलिए आप उनका उपयोग कर सकते हैं, लेकिन संदर्भ स्विच को स्वयं के माध्यम से प्रबंधित करना चाहिए yield। धागे वास्तव में वही हो सकते हैं जिनकी आपको आवश्यकता है, लेकिन मुझे नहीं पता कि वे नोड में कितने परिपक्व हैं।


3
बस आपकी जानकारी के लिए, webworkers (आंशिक रूप से) node.js. पर अनुकूलित किए गए हैं और node-workersपैकेज के रूप में उपलब्ध हैं । इस पर एक नज़र है: github.com/cramforce/node-worker
पार्थ ठक्कर

जानकर अच्छा लगा, धन्यवाद। डॉक्स बहुत दुर्लभ हैं, हालांकि, मुझे पता नहीं है कि क्या यह एक अलग थ्रेड, प्रक्रिया में चलता है, या बस एक ही प्रक्रिया में चलता है, और मेरे पास कोड खोदने का समय नहीं है, इसलिए मुझे पता नहीं है कि क्या यह हो सकता है आपके मामले के लिए काम करते हैं।
lanzz

@ParthThakkar: उस परियोजना को 3 साल में नहीं छुआ गया (2 जब आपने पोस्ट किया), और इसे पिछले 0.0.1 से नहीं बनाया है।
म्पेन

@ मर्क: उस पर मेरी अज्ञानता का कारण यह है कि मैं अभी तक एक पेशेवर प्रोग्रामर नहीं हूं। हेक, मैं एक विश्वविद्यालय में भी नहीं हूं। मैं अभी भी एक हाई स्कूल साथी हूं, जो स्कूल के काम को संभालने के अलावा प्रोग्रामिंग के बारे में भी पढ़ता रहता है। इसलिए, इस तरह के सभी मुद्दों के बारे में जानकारी रखना मेरे लिए संभव नहीं है। मैंने सिर्फ वही पोस्ट किया जो मुझे पता था ...
पार्थ ठक्कर

@ मर्क: हालाँकि परियोजना के इतिहास के बारे में यह बताना आपके लिए अच्छा था। मेरी भविष्य की प्रतिक्रियाओं में इस तरह की बातों का ध्यान रखा जाएगा !! :)
पार्थ ठक्कर

3

worker_threadsलागू किया गया है और एक झंडे के पीछे भेज दिया गया है node@10.5.0। यह अभी भी एक प्रारंभिक कार्यान्वयन है और भविष्य के रिलीज में इसे और अधिक कुशल बनाने के लिए अधिक प्रयासों की आवश्यकता है। नवीनतम में एक कोशिश देने के लायक node


2

कई नोड डेवलपर्स की राय में नोड के सबसे अच्छे हिस्सों में से एक वास्तव में इसकी एकल-थ्रेडेड प्रकृति है। थ्रेड्स साझा संसाधनों के साथ कठिनाइयों की एक पूरी श्रृंखला का परिचय देते हैं जो नोड पूरी तरह से कुछ भी नहीं बल्कि गैर-अवरुद्ध IO करने से बचते हैं।

यह कहना नहीं है कि नोड एकल धागे तक सीमित है। यह सिर्फ इतना है कि थ्रेडेड कंसीलर पाने की विधि उस चीज से अलग है जो आप खोज रहे हैं। थ्रेड से निपटने का मानक तरीका क्लस्टर मॉड्यूल के साथ है जो नोड के साथ मानक आता है। यह आपके कोड में मैन्युअल रूप से निपटने की तुलना में थ्रेड्स के लिए एक सरल दृष्टिकोण है।

अपने कोड में अतुल्यकालिक प्रोग्रामिंग से निपटने के लिए (के रूप में, नेस्टेड कॉलबैक पिरामिड से बचने के लिए), फाइबर्स लाइब्रेरी में [भविष्य] घटक एक सभ्य विकल्प है। मैं आपको यह भी सुझाव दूंगा कि आप Asyncblock की जाँच करें जो कि Fibers पर आधारित है। फाइबर अच्छे हैं क्योंकि वे आपको स्टैक को डुप्लिकेट करके कॉलबैक को छिपाने की अनुमति देते हैं और फिर एकल-थ्रेड पर ढेर के बीच कूदते हैं जैसा कि वे आवश्यक हैं। आपको लाभ देते हुए वास्तविक धागों की परेशानी से बचाता है। नकारात्मक पक्ष यह है कि फाइबर्स का उपयोग करते समय स्टैक के निशान थोड़ा अजीब हो सकते हैं, लेकिन वे बहुत खराब नहीं हैं।

यदि आपको एसिंक्स सामान के बारे में चिंता करने की आवश्यकता नहीं है और अधिक अवरुद्ध करने के बिना बहुत अधिक प्रसंस्करण करने में रुचि रखते हैं, तो एक सरल कॉल प्रोसेस.nextTick (कॉलबैक) हर एक बार एक समय में आपकी ज़रूरत है।


ठीक है, आपका सुझाव - समूहों के बारे में - जो मैंने शुरू में सोचा था। लेकिन इसके साथ समस्या यह है कि उनके ओवरहेड - v8 के एक नए उदाहरण को हर बार एक नई प्रक्रिया शुरू करने की आवश्यकता होती है, (~ 30ms, 10MB)। इसलिए, आप उनमें से बहुत सारे नहीं बना सकते। यह सीधे नोड डॉक्स से लिया गया है: ये चाइल्ड नोड्स (चाइल्डप्रोसेस के बारे में) अभी भी V8 के पूरे नए उदाहरण हैं। प्रत्येक नए नोड के लिए कम से कम 30ms स्टार्टअप और 10mb मेमोरी मान लें। यही है, आप उनमें से कई हजारों नहीं बना सकते।
पार्थ ठक्कर

1
यह बिल्कुल क्लस्टर का विचार है। आप प्रति सीपीयू कोर में एक कार्यकर्ता चलाते हैं। किसी भी अधिक सबसे अनावश्यक होने की संभावना है। यहां तक ​​कि सीपीयू के गहन कार्य एक अतुल्यकालिक शैली के साथ ठीक काम करेंगे। हालाँकि, यदि आपको वास्तव में पूर्ण विकसित थ्रेड्स की आवश्यकता है , तो आपको संभवतः किसी अन्य सर्वर बैकएंड पर जाने पर विचार करना चाहिए।
जेनेरिकडे

1

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

अब, यह सब कहने के बाद, मैं हुक के साथ बहुत काम कर रहा हूं। हाल ही में जो इस तरह के ऑफ-लोडिंग कार्यों के लिए अन्य प्रक्रियाओं में बहुत अच्छी तरह से काम करता है, हो सकता है कि यह आपकी आवश्यकता को पूरा कर सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.