कितने धागे बहुत सारे हैं?


312

मैं एक सर्वर लिख रहा हूं, और अनुरोध प्राप्त होने पर मैं प्रत्येक कार्रवाई को एक अलग थ्रेड में भेजता हूं। मैं ऐसा करता हूं क्योंकि लगभग हर अनुरोध एक डेटाबेस क्वेरी बनाता है। मैं थ्रेड्स के निर्माण / विनाश पर कटौती करने के लिए एक थ्रेडपूल लाइब्रेरी का उपयोग कर रहा हूं।

मेरा प्रश्न यह है कि इन जैसे I / O थ्रेड्स के लिए एक अच्छा कटऑफ पॉइंट क्या है? मुझे पता है कि यह सिर्फ एक मोटा अनुमान होगा, लेकिन क्या हम सैकड़ों बात कर रहे हैं? हजारों?

मैं कैसे पता लगाऊंगा कि यह कटऑफ क्या होगा?


संपादित करें:

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


1
@ryeguy: यदि आप प्रदर्शन की कोई समस्या नहीं है, तो आप यहाँ पर पूरे बिंदु को थ्रेडपूल में स्थापित नहीं कर सकते हैं। थ्रेड को ~ 100 थ्रेड्स तक सीमित करने की अधिकांश सलाह हास्यास्पद है, अधिकांश थ्रेड पूल के पास / रास्ते / उससे अधिक धागे हैं और कभी कोई समस्या नहीं है।
जियोचैट

ryeguy, नीचे मेरे जवाब के अलावा देखें कि क्या मापना है।
paxdiablo

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

1
@ जय डी: मैं कहूंगा कि जिस पल आप छत से टकराएंगे, जब आपका प्रदर्शन कम होने लगेगा।
नवजाल

6
@GEOCHET "यहाँ संपूर्ण बिंदु यह है कि आप थ्रेडपूल में कोई अधिकतम सेट नहीं करना चाहिए" उम्म्म ... बोलो क्या? फिक्स्ड-साइज थ्रेड पूल में सुशोभित गिरावट और स्केलेबिलिटी के लाभ हैं। एक नेटवर्क सेटिंग में, यदि आप क्लाइंट कनेक्शन के आधार पर नए थ्रेड्स पैदा कर रहे हैं, तो एक निश्चित पूल आकार के बिना आप सीखने का बहुत वास्तविक खतरा ( कठिन रास्ता ) चलाते हैं कि आपका सर्वर कितने धागे को संभाल सकता है, और हर एक जुड़ा क्लाइंट कष्ट होगा। एक निश्चित आकार का पूल एक पाइप वाल्व की तरह काम करता है, जो आपके सर्वर को चबाने से अधिक काटने की कोशिश करने से रोकता है।
b1nary.atr0phy

जवाबों:


206

कुछ लोग कहेंगे कि दो धागे बहुत अधिक हैं - मैं उस शिविर में काफी नहीं हूं :-)

यहाँ मेरी सलाह है: उपाय, अनुमान मत करो। एक सुझाव यह है कि इसे विन्यास योग्य बनाया जाए और शुरुआत में इसे 100 पर सेट किया जाए, फिर अपने सॉफ़्टवेयर को वाइल्ड पर छोड़ दें और मॉनिटर करें कि क्या होता है।

यदि आपके थ्रेड का उपयोग 3 पर है, तो 100 बहुत अधिक है। यदि यह दिन के अधिकांश समय 100 पर रहता है, तो इसे 200 तक उछालें और देखें कि क्या होता है।

आप वास्तव में अपना कोड स्वयं उपयोग की निगरानी कर सकते हैं और अगली बार शुरू होने वाले समय के लिए कॉन्फ़िगरेशन को समायोजित कर सकते हैं लेकिन यह संभवतः ओवरकिल है।


स्पष्टीकरण और विस्तार के लिए:

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

मैंने थ्रेड और डेटाबेस कनेक्शन पूलिंग कोड लिखा है और उनके पास निम्नलिखित विशेषताएं हैं (जो मुझे लगता है कि प्रदर्शन के लिए आवश्यक हैं):

  • सक्रिय थ्रेड्स की न्यूनतम संख्या।
  • धागे की एक अधिकतम संख्या।
  • कुछ समय के लिए उपयोग नहीं किए गए थ्रेड्स को बंद करना।

थ्रेड पूल क्लाइंट (यह थ्रेड की संख्या हमेशा उपयोग के लिए उपलब्ध है) के संदर्भ में न्यूनतम प्रदर्शन के लिए एक आधार रेखा निर्धारित करता है। दूसरा सक्रिय थ्रेड्स द्वारा संसाधन उपयोग पर प्रतिबंध लगाता है। तीसरा आपको शांत समय में आधार रेखा पर लौटाता है ताकि संसाधन का उपयोग कम से कम किया जा सके।

आपको काम करने के लिए पर्याप्त थ्रेड न होने के संसाधन उपयोग के खिलाफ अप्रयुक्त थ्रेड्स (ए) के संसाधन उपयोग को संतुलित करने की आवश्यकता है (बी)।

(ए) आम तौर पर स्मृति उपयोग (ढेर और इतने पर) है क्योंकि कोई काम नहीं कर रहा एक धागा सीपीयू का अधिक उपयोग नहीं करेगा। (बी) आम तौर पर अनुरोधों के प्रसंस्करण में देरी के रूप में वे आने के रूप में आप एक धागा उपलब्ध होने के लिए इंतजार करने की जरूरत है।

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

पहला DB कनेक्शन की संख्या उपलब्ध है। यह एक कठिन सीमा हो सकती है जब तक कि आप इसे डीबीएमएस में नहीं बढ़ा सकते हैं - मुझे लगता है कि आपका डीबीएमएस इस मामले में असीमित संख्या में कनेक्शन ले सकता है (हालांकि आपको आदर्श रूप में अच्छी तरह से मापना चाहिए)।

फिर, आपके ऐतिहासिक उपयोग के लिए आपको कितने थ्रेड्स पर निर्भर होना चाहिए। आपके पास चलने वाला न्यूनतम न्यूनतम संख्या है जिसे आपने कभी भी + A% चलाया है, एक पूर्णतम उदाहरण के साथ (उदाहरण के लिए, और इसे A की तरह ही कॉन्फ़िगर करने योग्य है) 5।

धागे की अधिकतम संख्या आपके ऐतिहासिक अधिकतम + बी% होनी चाहिए।

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


"वास्तव में मुझे क्या मापना चाहिए?" के जवाब में। सवाल:

आपको जो विशेष रूप से मापना चाहिए, वह है लोड के तहत समवर्ती उपयोग में धागे की अधिकतम मात्रा (उदाहरण के लिए, डीबी कॉल से वापसी पर प्रतीक्षा करना)। फिर उदाहरण के लिए 10% का सुरक्षा कारक जोड़ें (जोर दिया गया है, क्योंकि अन्य पोस्टर मेरे उदाहरणों को निश्चित सिफारिशों के रूप में लेते हैं)।

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


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

@ और, थ्रेड निर्माण में समय लगता है, और आप ऐतिहासिक डेटा [+ N%] के आधार पर इष्टतम संख्या निर्धारित कर सकते हैं (इसलिए मापें, अनुमान न लगाएं)। इसके अतिरिक्त, अधिक थ्रेड्स केवल संसाधन विवाद का कारण बनते हैं जब वे काम कर रहे होते हैं, सिग्नल / सेमाफोर पर इंतजार नहीं करते।
paxdiablo

थ्रेड पूल का उपयोग करते समय प्रदर्शन समस्या पैदा करने वाला 'थ्रेड क्रिएशन' का यह डेटा कहां है? एक अच्छा धागा पूल बनाने और कार्य के बीच में धागे को नष्ट नहीं करेगा।
जियोचैट

@ पैक्स यदि आपके सभी थ्रेड्स डीबी प्रश्नों को चलाने के लिए एक ही सेमफोरस पर प्रतीक्षा कर रहे हैं, तो यह विवाद की परिभाषा है। यह भी कहना सही नहीं है कि यदि वे अर्धवृत्त पर प्रतीक्षा कर रहे हैं तो धागे को कुछ भी खर्च नहीं करना चाहिए।
एंड्रयू ग्रांट

1
@ और, मैं यह नहीं देख सकता कि आप डीबी क्वेरी को क्यों रोकेंगे, कोई भी सभ्य डीबी समवर्ती पहुंच की अनुमति देगा, जिसके जवाब में कई सूत्र प्रतीक्षा करेंगे। और थ्रेड्स को किसी भी निष्पादन समय पर खर्च नहीं करना चाहिए जबकि अर्ध-अवरुद्ध, उन्हें अवरुद्ध कतार में तब तक बैठना चाहिए जब तक कि सेमीफोर जारी न हो जाए।
paxdiablo

36

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

  1. थ्रेड स्टैक आकार: लिनक्स में डिफॉल्ट थ्रेड स्टैक का आकार 8 एमबी है (आप इसे खोजने के लिए अलिमिट-ए का उपयोग कर सकते हैं)।
  2. मैक्स वर्चुअल मेमोरी जो एक दिया गया ओएस वेरिएंट सपोर्ट करता है। लिनक्स कर्नेल 2.4 एक मेमोरी एड्रेस स्पेस 2 जीबी का समर्थन करता है। कर्नेल 2.6 के साथ, मैं थोड़ा बड़ा (3 जीबी)
  3. [१] प्रति मैक्स वीएम सपोर्टेड थ्रेड्स की अधिकतम संख्या के लिए गणना दर्शाता है। 2.4 के लिए यह लगभग 255 धागे निकला। 2.6 के लिए संख्या थोड़ी बड़ी है।
  4. आपके पास किस तरह का कर्नेल शेड्यूल है। 2.6 के साथ लिनक्स 2.4 कर्नेल शेड्यूलर की तुलना करना, बाद में आपको सिस्टम में मौजूद कार्यों की संख्या पर निर्भरता के साथ ओ (1) शेड्यूल देता है जबकि पहले एक ओ (एन) से अधिक है। तो कर्नेल शेड्यूल की एसएमपी क्षमताएं भी एक सिस्टम में अधिकतम स्थायी थ्रेड्स में एक अच्छी भूमिका निभाती हैं।

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

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

मुझे यकीन है कि विंडोज़ कर्नेल अनुसूचक भी संसाधनों के उपयोग से निपटने के लिए इस तरह का कुछ करता है

[१] http://adywicaksono.wordpress.com/2007/07/10/i-can-not-create-more-than-255-threads-on-linux-what-is-the-solutions/


17

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

'सबसे अच्छा मामला' यह है कि आपके बाद के धागे स्टाल होंगे, जबकि पहले वाले पूरे होंगे, या कुछ के पास कम विवाद वाले संसाधनों पर कम-ओवरहेड ब्लॉक होंगे। सबसे बुरी स्थिति यह है कि आप कैश / डिस्क / नेटवर्क और फर्श के माध्यम से अपने समग्र प्रवाह को छोड़ना शुरू करते हैं।

एक अच्छा समाधान एक पूल में अनुरोधों को रखने के लिए है जो तब थ्रेड-पूल से कार्यकर्ता थ्रेड्स में भेजे जाते हैं (और हाँ, निरंतर थ्रेड निर्माण / विनाश से बचना एक महान पहला कदम है)।

इस पूल में सक्रिय थ्रेड्स की संख्या को आपके प्रोफाइलिंग, आपके द्वारा चलाए जा रहे हार्डवेयर और मशीन पर होने वाली अन्य चीजों के आधार पर ट्विक और स्केल किया जा सकता है।


हां, और इसका उपयोग अनुरोधों की कतार या पूल के साथ किया जाना चाहिए।
एंड्रयू ग्रांट

2
@ और: क्यों? यह अनुरोध प्राप्त होने पर प्रत्येक बार थ्रेड पूल में एक कार्य जोड़ना चाहिए। उपलब्ध होने पर कार्य के लिए एक धागा आवंटित करना थ्रेड पूल पर निर्भर है।
जियोचैट

तो आप क्या करते हैं जब आपके पास सैकड़ों अनुरोध आते हैं और धागे से बाहर होते हैं? अधिक बनाएँ? खंड मैथा? एक त्रुटि लौटाओ? अपने अनुरोधों को एक ऐसे पूल में रखें जो आवश्यकता के अनुसार बड़ा हो सकता है, और फिर इन कतारबद्ध अनुरोधों को अपने थ्रेड पूल में फ़ीड करें क्योंकि धागे मुक्त हो जाते हैं।
एंड्रयू ग्रांट

"कई कार्य करने के लिए कई थ्रेड बनाए जाते हैं, जो आमतौर पर एक कतार में आयोजित किए जाते हैं। आमतौर पर, थ्रेड्स की तुलना में कई अधिक कार्य होते हैं। जैसे ही कोई थ्रेड अपना कार्य पूरा करता है, यह कतार से अगले कार्य का अनुरोध करेगा। जब तक सभी कार्य पूरे नहीं हो जाते। ”
जियोचैट

@ और: मुझे यकीन नहीं है कि ओपी कौन सा पायथन थ्रेड पूल उपयोग कर रहा है, लेकिन अगर आप इस कार्यक्षमता का वास्तविक विश्व उदाहरण चाहते हैं, जिसका मैं वर्णन कर रहा हूं: msdn.microsoft.com/en-us/library/…
GEOCHON

10

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

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


4
इसे पढ़ने के बाद, मैंने तीन थ्रेड्स पर एराटोस्थनीज कार्यों की चलनी की कोशिश की। निश्चित रूप से, यह वास्तव में एक ही सूत्र में समान कार्य चलाने की तुलना में 50% धीमा था । सर उठाने के लिए धन्यवाद। मैं एक वर्चुअल मशीन पर एक्लिप्स पायदेव चला रहा था जिसे दो सीपीयू आवंटित किया गया था। अगला, मैं एक परिदृश्य की कोशिश करूँगा जिसमें कुछ डेटाबेस कॉल शामिल हैं।
डॉन किर्कबी

3
कार्यों के दो (कम से कम) प्रकार हैं: सीपीयू बाउंड (जैसे इमेज प्रोसेसिंग) और आई / ओ बाउंड (जैसे नेटवर्क से डाउनलोड करना)। जाहिर है, जीआईएल "समस्या" I / O बाध्य कार्यों को बहुत अधिक प्रभावित नहीं करेगा। यदि आपके कार्य सीपीयू बाध्य हैं तो आपको मल्टीथ्रेडिंग के बजाय मल्टीप्रोसेसिंग पर विचार करना चाहिए।
इतिनवग

1
हाँ, अजगर धागा में सुधार हुआ है यदि आपके पास बहुत सारा नेटवर्क है। मैं इसे धागे में बदल देता हूँ और साधारण कोड की तुलना में 10 * तेज हो जाता है ...
tyan

8

जैसा कि पैक्स ने सही कहा है, माप, अनुमान मत करो । जो मैंने DNSwitness के लिए किया था और परिणाम शानदार थे: सबसे तेज परिणाम प्राप्त करने के लिए थ्रेड्स की आदर्श संख्या मेरे विचार से बहुत अधिक थी।

बेशक, यह कई बातों पर निर्भर करता है, इसलिए आपको खुद को मापना चाहिए।

कॉम्बीएन डे फिलैक्स में सावधानी पूर्ण उपाय (केवल फ्रेंच में) ?


1
15,000? यह मेरी अपेक्षा से कहीं अधिक है। फिर भी, अगर आपको यही मिला है, तो आपको यही मिला है, मैं उससे बहस नहीं कर सकता।
पैक्सिडाब्लो

2
इस विशिष्ट एप्लिकेशन के लिए, अधिकांश थ्रेड्स DNS सर्वर से सिर्फ एक प्रतिक्रिया का इंतजार कर रहे हैं। तो, अधिक समानता, बेहतर, दीवार-घड़ी के समय में।
बोर्त्ज़मेयर

18
मुझे लगता है कि अगर आपके पास 15000 धागे हैं जो किसी बाहरी I / O पर रोक रहे हैं तो एक बेहतर समाधान बड़े पैमाने पर कम धागे होंगे लेकिन एक अतुल्यकालिक मॉडल के साथ। मैं यहां अनुभव से बोलता हूं।
स्टीव

5

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

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

ध्यान दें कि यह प्रश्न में सिस्टम (ओं) को मानता है जो आपके ऐप के लिए समर्पित हैं, और आपको अच्छी तरह से खेलने की ज़रूरत नहीं है (अन्य ऐप को भूखे रहने से बचें)।


1
क्या आप थ्रेड काउंट के लिए देखी गई कुछ संख्याओं का उल्लेख कर सकते हैं? यह सिर्फ यह समझ पाने के लिए उपयोगी होगा। धन्यवाद।
कोवैक

3

"बड़ा लोहा" उत्तर आम तौर पर प्रति सीमित संसाधन - प्रोसेसर (सीपीयू बाउंड), आर्म (आई / ओ बाउंड), आदि के लिए एक धागा है - लेकिन यह केवल तभी काम करता है जब आप संसाधन के लिए सही थ्रेड के लिए काम कर सकते हैं पहुँचा जा सकता है।

जहां यह संभव नहीं है, इस बात पर विचार करें कि आपके पास fungible resource (CPU) और non-fungible Resources (arm) हैं। सीपीयू के लिए प्रत्येक धागे को एक विशिष्ट सीपीयू (हालांकि यह कैश प्रबंधन के साथ मदद करता है) को सौंपने के लिए महत्वपूर्ण नहीं है, लेकिन हथियारों के लिए, यदि आप हाथ को एक धागा नहीं दे सकते हैं, तो आप कतारबद्ध सिद्धांत में आते हैं और हथियार रखने के लिए इष्टतम संख्या क्या है। व्यस्त। आम तौर पर मैं सोच रहा था कि यदि आप उपयोग किए गए हाथ के आधार पर अनुरोधों को रूट नहीं कर सकते हैं, तो प्रति हाथ 2-3 धागे होने का अधिकार होने वाला है।

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

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

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


2

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


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

1
@ हमर: उम नं। थ्रेड्स का विचार I / O और अन्य कार्यों को अवरुद्ध करने की अनुमति देना है।
जियोचैट

4
मैंने जो बयान दिया वह यह था कि एक मशीन पर कोर की संख्या थ्रेड्स की संख्या पर एक कठिन सीमा का प्रतिनिधित्व करती है जो एक निश्चित समय पर काम कर सकती है, जो एक तथ्य है। बेशक अन्य सूत्र I / O संचालन को पूरा करने के लिए इंतजार कर रहे होंगे, और इस सवाल के लिए जो एक महत्वपूर्ण विचार है।
नवोदित

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

2
+1 वास्तव में यह समझने के लिए कि कंप्यूटर कैसे काम करते हैं। @ मिमी: आपको कई प्रोसेसर होने के बीच के अंतर को समझने की आवश्यकता है, और कई प्रोसेसर हैं। @ रीच बी: थ्रेड्स के संग्रह को संभालने के लिए एक थ्रेड पूल कई तरीकों में से एक है। यह एक अच्छा है, लेकिन निश्चित रूप से केवल एक ही नहीं है।
शोक

2

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


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

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

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

@mmr: इस सवाल पर विचार करने के बारे में था / थ्रेड / पूल, हाँ, मुझे लगता है कि लोगों को थ्रेड्स के बारे में जवाब की उम्मीद करनी चाहिए।
जियोचैट

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

1

ryeguy, मैं वर्तमान में एक समान एप्लिकेशन विकसित कर रहा हूं और मेरी थ्रेड संख्या 15 पर सेट है। दुर्भाग्य से अगर मैं इसे 20 पर बढ़ाता हूं, तो यह क्रैश हो जाता है। तो, हां, मुझे लगता है कि इसे संभालने का सबसे अच्छा तरीका यह मापना है कि क्या आपका वर्तमान कॉन्फ़िगरेशन थ्रेड्स की संख्या X से अधिक या कम अनुमति देता है।


5
अपने थ्रेड काउंट में जोड़ना बेतरतीब ढंग से आपके ऐप को क्रैश नहीं करना चाहिए। कुछ कारण है। आप कारण का पता लगाने के लिए अच्छा करेंगे क्योंकि यह कुछ परिस्थितियों में कम धागे के साथ भी आपको प्रभावित कर सकता है, कौन जानता है।
मैथ्यू लंड

-6

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

आप इस बारे में अधिक जानकारी प्राप्त कर सकते हैं कि यह यहाँ कैसे काम करना चाहिए: http://en.wikipedia.org/wiki/Thread_pool_pattern


1
@ पैक्स: यह पहली बार नहीं होगा जब अधिकांश लोग सवाल का जवाब हाथ में नहीं देना चाहते थे (या इसे समझ सकते हैं)। मैं चिंतित नहीं हूँ।
जियोचैट

-10

सीपीयू कोर के रूप में कई धागे हैं जो मैंने बहुत बार सुना है।


5
@ रीच, कम से कम समझाएं क्यों :-)। यह नियम केवल अंगूठे पर लागू होता है जब सभी थ्रेड्स सीपीयू-बाउंड होते हैं; उन्हें प्रत्येक में एक 'सीपीयू' मिलता है। जब थ्रेड्स में से कई I / O बाध्य होते हैं, तो आमतौर पर 'CPU' (सीपीयू को उद्धृत किया जाता है क्योंकि यह निष्पादन के भौतिक थ्रेड्स, जैसे कोर पर लागू होता है) से बेहतर है।
पैक्सिडाब्लो

1
@Abgan, मुझे यकीन नहीं था कि, शायद पायथन "असली" OS थ्रेड्स (कई सीपीयू पर चलाएगा) बनाएगा। यदि आप जो कहते हैं वह सच है (मेरे पास संदेह का कोई कारण नहीं है), तो सीपीयू मात्रा का कोई असर नहीं है - थ्रेडिंग उपयोगी है, केवल तब जब अधिकांश धागे किसी चीज की प्रतीक्षा कर रहे हों (जैसे डीबी आई / ओ)।
paxdiablo

1
@ रिच: जब (असली) थ्रेडिंग करते हैं, तो सीपीयू काउंट डीओईएस असर करता है क्योंकि आप कई गैर-प्रतीक्षा वाले थ्रेड वास्तव में समवर्ती चला सकते हैं। एक सीपीयू के साथ, केवल एक ही चलता है और लाभ गैर-सीपीयू संसाधन की प्रतीक्षा में कई अन्य धागे होने से होता है।
पैक्सडिब्लो

1
@ पैक्स: आप थ्रेड पूल की अवधारणा को नहीं समझते हैं तो मुझे लगता है।
जियोचैट

1
@, मैं थ्रेड पूल को ठीक समझता हूं; ऐसा प्रतीत होता है कि मैं (और अन्य लोग) भी हार्डवेयर को आपसे बेहतर समझते हैं। एक सीपीयू के साथ, केवल एक निष्पादन थ्रेड चल सकता है, भले ही कोई अन्य सीपीयू की प्रतीक्षा कर रहा हो। दो सीपीयू, दो चला सकते हैं। Iff सभी थ्रेड्स सीपीयू की प्रतीक्षा कर रहे हैं, आदर्श थ्रेड काउंट बराबर है ...
paxdiablo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.