2012-07-28 16 views
7

मैं एक समस्या के बीच में हूं जहां मैं यह तय करने में असमर्थ हूं कि कौन सा समाधान लेना है।थ्रेड पूल बनाम कई व्यक्तिगत थ्रेड

समस्या थोड़ा अद्वितीय है। आइए इसे इस तरह से रखें, मैं लगातार नेटवर्क से डेटा प्राप्त कर रहा हूं (प्रति सेकंड 2 से 4 बार)। अब प्रत्येक डेटा एक अलग से संबंधित है, कहें, समूह। अब, इन समूहों, समूह 1, समूह 2 और अन्य को कॉल करने दें।

प्रत्येक समूह के लिए एक समर्पित काम कतार जहां नेटवर्क से डेटा फ़िल्टर और प्रसंस्करण के लिए उसके संगत समूह में जोड़ा जाता है।

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

लेकिन मेरे वरिष्ठ सुझाव दिया है कि मैं धागा पूल का उपयोग करना चाहिए क्योंकि इस तरह धागे अभ्यस्त अवरुद्ध हो और प्रसंस्करण के लिए अन्य समूहों द्वारा प्रयोग करने योग्य हो जाएगा।

लेकिन यहाँ बात है, डेटा im हो रही काफी तेजी से और समय एक धागा ले जाता है यह, के लिए संभवतः, नहीं मोड अवरुद्ध में जाने थ्रेड के लिए काफी लंबे समय है कार्रवाई करने के लिए। और यह भी गारंटी देगा कि डेटा अनुक्रमिक रूप से संसाधित हो जाता है (नौकरी 1 नौकरी 2 से पहले किया जाता है), जो पूलिंग में बहुत कम संभावनाएं होती हैं, ऐसा नहीं हो सकता है।);

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

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

लेकिन मेरे मामले में समूह 1, समूह 2, ..., समूह हमेशा जीवित रहता है। तो यदि डेटा है या नहीं तो वे अभी भी वहां होंगे। तो धागा spawning यहाँ मुद्दा नहीं है।

मेरे वरिष्ठ आश्वस्त नहीं है और मुझे पूलिंग समाधान के साथ जाने के लिए अपनी स्मृति पदचिह्न बहुत अच्छा है क्योंकि चाहता है।

तो, कौन सा रास्ता लेना है?

धन्यवाद।

+0

इस तरह की स्थिति में केवल एक ही जवाब है। ठंडा कठिन तथ्यों! साबित करें कि उचित नियंत्रित मॉडल/प्रोटोटाइप के साथ बेहतर है। आप दोनों आश्चर्यचकित हो सकते हैं क्योंकि प्रत्येक अलग-अलग परिस्थितियों में मान्य हो सकता है। –

+0

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

+0

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

उत्तर

2

अच्छा सवाल। पूलिंग वास्तव में आपको प्रारंभिक समय बचाता है, जैसा आपने कहा था। लेकिन इसका एक और पहलू है: संसाधन प्रबंधन। और यहां मैं आपसे यह पूछ रहा हूं- आपके पास कितने समूह (पढ़े गए समर्पित धागे) हैं? क्या वे आवेदन के निष्पादन अवधि के दौरान गतिशील रूप से बढ़ते हैं?

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

उपरोक्त को ध्यान में रखते हुए, मुझे बहुत संभव है कि आपके मामले में, प्रत्येक समूह के लिए धागा समर्पित होना बहुत अच्छा है!

वही आपके वरिष्ठ के दृढ़ विश्वास के लिए जाता है कि यह स्मृति को बचाएगा .. दरअसल, एक धागा ढेर पर स्मृति लेता है, लेकिन वास्तव में यह बहुत अधिक है, अगर यह एक पूर्वनिर्धारित राशि है, तो 5 कहें। शायद ठीक है। वैसे भी, आपको पूलिंग का उपयोग नहीं करना चाहिए जबतक कि आप एक प्राइरी नहीं हैं और पूरी तरह से आश्वस्त हैं कि आपको वास्तव में कोई समस्या है!

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

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

+0

उत्तर के लिए धन्यवाद। गतिशील समूह निर्माण के लिए, कोई भी समूह गतिशील रूप से नहीं बनाए जाते हैं। लेकिन बहुत सारे समूह हैं, लगभग 15-20। उन्हें बढ़ने की उम्मीद है लेकिन वे शुरुआत में बनाए और स्थापित किए जाएंगे। अब निष्पादन अनुक्रम एक मुद्दा है जहां पूलिंग शायद ही कभी परेशानी साबित हो सकती है। लेकिन आपने मुझे स्पष्ट रूप से बताया है कि पूल में धागे पूलिंग के बिना लोगों की तुलना में कम स्मृति लेते हैं। धन्यवाद। –

+1

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

+2

@JBNizet के रूप में, थ्रेडपूल में धागे एक ही थ्रेड हैं। एक और तंत्र है जो उनके जीवनकाल के लिए ज़िम्मेदार है। थ्रेडपूल में थ्रेड * नियमित धागे की तुलना में कम स्मृति नहीं लेते हैं। निम्न पर विचार करें: चूंकि आपके पास अपेक्षाकृत कई समूह हैं, इसलिए मैं सावधानीपूर्वक निष्कर्ष निकाल सकता हूं कि आप * थ्रेडपूल के साथ बेहतर हो सकते हैं: जैसा कि मैंने संसाधन प्रबंधन परिप्रेक्ष्य से उल्लेख किया है, यदि आपके पास कोर चलाने के लिए कोर से अधिक धागे हैं (और आपका तर्क ज्यादातर सीपीयू बाध्य है) आप सीटीएक्स स्विचिंग में ज्यादा समय व्यतीत करेंगे। एक बार फिर, पूरी तरह से प्रदर्शन परीक्षण की आवश्यकता है! – Vitaliy

3

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

आपकी विशेष समस्या के लिए, मुझे लगता है कि प्रत्येक परिदृश्य में वास्तव में प्रदर्शन/थ्रेड उपयोग आदि को मापने की कुंजी है। जब तक आप बाधाओं में भाग नहीं लेते, मैं शायद यह सुनिश्चित करने के अलावा कि आप अपने आवेदन पर एक बड़े प्रभाव के बिना किसी अन्य कार्यान्वयन को स्वैप कर सकते हैं, अन्यथा चिंता न करें। याद रखें कि समयपूर्व अनुकूलन सभी बुराई की जड़ है। Note that:

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

+0

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

+0

अनुक्रम संख्या और एक 'शोधकर्ता' वर्ग/धागा जो आउट-ऑफ-ऑर्डर आउटपुट की एक सूची/कतार रखता है जब तक कि पहले के सभी लोग आते हैं। –

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