आपको "हजारों के सैकड़ों" धागे की आवश्यकता कब होगी?


31

एर्लैंग, गो, और रस्ट सभी तरह से एक या दूसरे तरीके से दावा करते हैं कि वे सस्ते "थ्रेड्स" / कोराउटाइन के साथ समवर्ती प्रोग्रामिंग का समर्थन करते हैं। जाओ पूछे जाने वाले प्रश्न कहता है:

एक ही एड्रेस स्पेस में सैकड़ों-हज़ारों गोरआउट बनाना व्यावहारिक है।

जंग ट्यूटोरियल का कहना है:

क्योंकि पारंपरिक थ्रेड्स की तुलना में कार्यों को बनाने के लिए काफी सस्ता है, रूस्ट एक विशिष्ट 32-बिट सिस्टम पर सैकड़ों हजारों समवर्ती कार्य बना सकते हैं।

एर्लैंग के दस्तावेज़ कहते हैं:

233 शब्दों का डिफ़ॉल्ट प्रारंभिक ढेर का आकार Erlang सिस्टम को सैकड़ों हजारों या लाखों प्रक्रियाओं के साथ समर्थन करने के लिए काफी रूढ़िवादी है।

मेरा प्रश्न: किस तरह के आवेदन के लिए निष्पादन के इतने समवर्ती धागे की आवश्यकता होती है? केवल वेब सर्वरों के सबसे व्यस्त हजारों समकालिक आगंतुक मिलते हैं। बॉस-वर्कर / जॉब-डिस्पैचिंग प्रकार के एप्लिकेशन जो मैंने लिखे हैं, जब हिट्स / प्रक्रियाओं की संख्या भौतिक कोर की संख्या से बहुत अधिक होती है, तो हिट रिटर्न कम होता है। मुझे लगता है कि यह संख्यात्मक अनुप्रयोगों के लिए समझ में आ सकता है, लेकिन वास्तव में अधिकांश लोग फोरट्रान / सी / सी ++ में लिखे गए तृतीय पक्ष पुस्तकालयों के समानांतर समानता का प्रतिनिधित्व करते हैं, न कि इन नई पीढ़ी की भाषाओं का।


5
मुझे लगता है कि आपके भ्रम का स्रोत यह है: ये माइक्रोथ्रेड्स / कार्य / आदि मुख्य रूप से ओएस थ्रेड्स / प्रक्रियाओं के विकल्प के रूप में नहीं हैं, जिनके बारे में आप बात नहीं करते हैं, न ही इनका उपयोग नंबर क्रंचिंग के आसानी से समानांतर बड़े चंक को विभाजित करने के लिए किया जाता है। कुछ कोर के बीच (जैसा कि आपने सही ढंग से टिप्पणी की है, उस उद्देश्य के लिए 4 कोर पर 100k थ्रेड होने का कोई मतलब नहीं है)।
us2012

1
तो फिर वे किस लिए हैं? शायद मैं भोला हूँ, लेकिन मैंने कभी ऐसी स्थिति का सामना नहीं किया है जहाँ पर कोरटाइन / आदि को प्रस्तुत करना एक एकल-थ्रेड-निष्पादन कार्यक्रम को सरल बनाया गया हो। और मैं प्रक्रियाओं के साथ संगणना के "निम्न" स्तर प्राप्त करने में सक्षम हूं, जो कि लिनक्स पर मैं एक पसीने को तोड़ने के बिना सैकड़ों या हजारों लॉन्च कर सकता हूं।
user39019

यह बहुत कम समझ में आता है कि कई कार्य वास्तव में काम कर रहे हैं। इसका मतलब यह नहीं है कि आप बड़ी संख्या में ऐसे कार्य नहीं कर सकते थे, जो अधिकतर कुछ होने की प्रतीक्षा में अवरुद्ध थे।
लोरेन Pechtel

5
कार्य-आधारित अतुल्यकालिक बनाम धागा-आधारित अतुल्यकालिक का विचार यह कहना है कि उपयोगकर्ता कोड को उन कार्यों पर ध्यान केंद्रित करना चाहिए जो उन कार्यों को करने वाले श्रमिकों को प्रबंधित करने के बजाय होने चाहिए । एक मजदूर के रूप में एक धागा के बारे में सोचो जो आप किराया करते हैं; एक कार्यकर्ता को काम पर रखना महंगा है, और यदि आप ऐसा करते हैं, तो आप चाहते हैं कि वे 100% समय में अधिक से अधिक कार्यों में मेहनत करें। सिस्टम के बहुत सारे कार्य सैकड़ों या हजारों लंबित कार्यों के रूप में किए जा सकते हैं, लेकिन आपको सैकड़ों या हजारों श्रमिकों की आवश्यकता नहीं है।
एरिक लिपर्ट

@ एरिकलिपर्ट की टिप्पणी पर जारी रखते हुए, कई परिस्थितियां हैं जहां सैकड़ों हजारों कार्य मौजूद होंगे। उदाहरण # 1: डेटा-समांतर कार्य का अपघटन, जैसे छवि प्रसंस्करण। उदाहरण # 2: एक सर्वर जो हजारों ग्राहकों का समर्थन करता है, जिनमें से प्रत्येक संभावित रूप से किसी भी समय एक कमांड जारी कर सकता है। प्रत्येक कार्य को अपने "हल्के निष्पादन संदर्भ" की आवश्यकता होती है - यह याद रखने की क्षमता कि यह किस स्थिति में है (संचार प्रोटोकॉल), और वर्तमान में इसे निष्पादित कर रहा है, और कुछ और। लाइटवेट तब तक संभव है जब तक प्रत्येक में उथले कॉल स्टैक होते हैं।
rwong

जवाबों:


19

एक उपयोग का मामला - वेबसोकेट:
चूंकि वेबसॉकेट सरल अनुरोधों की तुलना में लंबे समय तक जीवित रहते हैं, व्यस्त सर्वर पर बहुत सारे वेबसोकेट समय के साथ जमा हो जाएंगे। microthreads आपको एक अच्छा वैचारिक मॉडलिंग और एक अपेक्षाकृत आसान कार्यान्वयन देता है।

सामान्य तौर पर, ऐसे मामले जिनमें कई या कम स्वायत्त इकाइयाँ होती हैं, वे इस बात का इंतज़ार कर रही होती हैं कि कुछ घटनाओं का अच्छा उपयोग हो।


15

यह सोचने में मदद मिल सकती है कि एरलांग मूल रूप से क्या करने के लिए डिज़ाइन किया गया था, जिसे दूरसंचार का प्रबंधन करना था। रूटिंग, स्विचिंग, सेंसर संग्रह / एकत्रीकरण आदि गतिविधियाँ।

इसे वेब दुनिया में लाना - ट्विटर जैसी प्रणाली पर विचार करें । सिस्टम शायद वेब पेज बनाने में माइक्रोथ्रेड्स का उपयोग नहीं करेगा, लेकिन यह उन्हें इसके संग्रह / कैशिंग / ट्वीट्स के वितरण में उपयोग कर सकता है।

यह लेख आगे की मदद हो सकती है।


11

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

इस Erlang फ़ंक्शन पर विचार करें, जो एक काउंटर बनाए रखता है:

counter(Value) ->
    receive                               % Sit idle until a message is received
        increment -> counter(Value + 1);  % Restart with incremented value
        decrement -> counter(Value - 1);  % Restart with decremented value
        speak     ->
            io:fwrite("~B~n", [Value]),
            counter(Value);               % Restart with unaltered value
        _         -> counter(Value)       % Anything else?  Do nothing.
    end.

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

आप शायद इस विचार के अभ्यस्त हैं कि संदर्भ स्विच महंगे हैं, जो अभी भी होस्ट ओएस के दृष्टिकोण से सही है। Erlang रनटाइम अपने आप में एक छोटा सा ऑपरेटिंग सिस्टम है, इसलिए अपनी स्वयं की प्रक्रियाओं के बीच स्विच करना त्वरित और कुशल है, सभी संदर्भ स्विच की संख्या को रखते हुए OS न्यूनतम तक कम हो जाता है। इस कारण से, कई हजारों प्रक्रियाओं का होना कोई समस्या नहीं है और इसे प्रोत्साहित किया जाता है।


1
आपके अंतिम एप्लिकेशन को counter/1लोअरकेस सी का उपयोग करना चाहिए;) मैंने इसे ठीक करने की कोशिश की, लेकिन StackExchange को 1-वर्ण संपादन पसंद नहीं है।
d11wtq

4

मेरा प्रश्न: किस तरह के आवेदन के लिए निष्पादन के इतने समवर्ती धागे की आवश्यकता होती है?

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

2) बस शुरू में प्रति अनुरोध एक गोरोइन। आंतरिक रूप से गोरोइन का उपयोग करने के बहुत सारे कारण हैं।

  • 100 के साथ-साथ अनुरोधों के साथ एक वेब ऐप पर विचार करें, लेकिन प्रत्येक अनुरोध 100 के बैक-एंड अनुरोधों को उत्पन्न करता है। स्पष्ट उदाहरण एक खोज इंजन एग्रीगेटर है। लेकिन सुंदर कोई भी ऐप स्क्रीन पर प्रत्येक "क्षेत्र" के लिए गोरोइटिन बना सकता है, फिर उन्हें क्रमिक रूप से स्वतंत्र रूप से उत्पन्न कर सकता है। उदाहरण के लिए, Amazon.com पर प्रत्येक पृष्ठ 150+ बैक-एंड अनुरोधों से बना है, जो आपके लिए केवल इकट्ठे हैं। आप ध्यान नहीं देते क्योंकि वे समानांतर हैं, अनुक्रमिक नहीं हैं, और प्रत्येक "क्षेत्र" यह स्वयं की वेब सेवा है।
  • किसी भी ऐप पर विचार करें जहां विश्वसनीयता और विलंबता सर्वोपरि हो। आप शायद प्रत्येक आने वाले अनुरोध को कुछ बैक-एंड अनुरोधों को बंद करने के लिए चाहते हैं, और जो भी डेटा पहले वापस आए
  • अपने ऐप में किए गए किसी भी "क्लाइंट जॉइन" पर विचार करें। "प्रत्येक तत्व के लिए, डेटा प्राप्त करें" कहने के बजाय, आप गोरआउट्स का एक गुच्छा बंद कर सकते हैं। यदि आपके पास दास DBs का एक गुच्छा क्वेरी करने के लिए है, तो आप जादुई रूप से N समय तेजी से जाएंगे। यदि आप नहीं करते हैं, तो यह किसी भी धीमी नहीं होगी।

थ्रेड्स / प्रक्रियाओं की संख्या भौतिक कोर की संख्या से बहुत अधिक होने पर रिटर्न कम हो जाता है

प्रदर्शन सीएसपी में एक कार्यक्रम को तोड़ने का एकमात्र कारण नहीं है । यह वास्तव में कार्यक्रम को समझने में आसान बना सकता है, और कुछ समस्याओं को बहुत कम कोड के साथ हल किया जा सकता है।

जैसा कि ऊपर दी गई स्लाइड्स में है, आपके कोड में समरूपता समस्या को व्यवस्थित करने का एक तरीका है। गोरोइटिन का न होना आपकी भाषा में मैप / डिक्टोनरी / हैश डेटा संरचना नहीं होने जैसा है। आप इसके बिना प्राप्त कर सकते हैं। लेकिन एक बार आपके पास होने के बाद, आप इसे हर जगह उपयोग करना शुरू कर देते हैं, और यह वास्तव में आपके कार्यक्रम को सरल बनाता है।

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

चूंकि संगामिति अधिकांश भाषाओं का प्रथम श्रेणी का हिस्सा नहीं है, आज के प्रोग्रामर्स के लिए यह एक दृष्टिगोचर है कि यह उनके लिए उपयोगी क्यों होगा। यह केवल अधिक स्पष्ट हो जाएगा क्योंकि प्रत्येक फोन और कलाई घड़ी 1000 कोर की ओर बढ़ेगी। एक अंतर्निहित रेस-डिटेक्टर उपकरण के साथ जहाजों पर जाएं।


2

Erlang के लिए प्रति कनेक्शन या अन्य कार्य के लिए एक प्रक्रिया होना आम है। इसलिए उदाहरण के लिए एक स्ट्रीमिंग ऑडियो सर्वर से जुड़ा उपयोगकर्ता प्रति 1 प्रक्रिया हो सकता है।

Erlang VM को हजारों या हजारों प्रक्रियाओं को संभालने के लिए अनुकूलित किया गया है, संदर्भ स्विच को बहुत सस्ता बनाकर।


1

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


1

Erlang के लिए एक सरल उदाहरण, जिसे संचार के लिए डिज़ाइन किया गया था: नेटवर्क पैकेट स्थानांतरित करना। जब आप एक http अनुरोध करते हैं, तो आपके पास हजारों टीसीपी / आईपी पैकेट हो सकते हैं। इसमें जोड़ें कि हर कोई एक ही समय में जोड़ता है, और आपके पास आपका उपयोग मामला है।

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


-2

कुछ कार्य यहाँ मन को वसंत प्रदान करते हैं। यदि आप किसी छवि के प्रत्येक पिक्सेल पर ops की एक लंबी श्रृंखला कर रहे हैं, और यदि वे ops समानांतर हैं, तो अपेक्षाकृत छोटी 1024x768 छवि "सैकड़ों हजारों" ब्रैकेट में सही है।


2
कुछ साल पहले, मैंने वास्तविक समय FLIR छवि-प्रसंस्करण करते हुए कुछ साल बिताए, प्रति सेकंड 30 फ्रेम पर 256x256 चित्र क्रंच किए। जब तक आपके पास बहुत सारे हार्डवेयर प्रोसेसर, और उनके बीच अपने डेटा को विभाजित करने का एक सहज तरीका है, तब तक आप जो सबसे बड़ी चीज करना चाहते हैं वह है संदर्भ कम्प्यूटिंग लागत, मेमोरी कॉन्टैक्शन और कैश को वास्तविक कम्प्यूटेशनल लागतों पर जोर देना।
जॉन आर। स्ट्रोहम

यह काम किए जाने पर निर्भर करता है। यदि आप जो कुछ भी कर रहे हैं वह एक हार्डवेयर कोर / निष्पादन इकाई को एक काम सौंप रहा है, जिसके बाद आप इसे प्रभावी रूप से भूल सकते हैं (और ध्यान दें कि यह GPU के काम करने का तरीका है, इसलिए यह एक काल्पनिक परिदृश्य नहीं है) तो दृष्टिकोण है वैध।
मैक्सिमस मिनिमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.