Omnithreadlibrary - waitforexit
अधिकांश डेवलपर के रूप में काम करने से हमें हमारे उच्च-स्तर-अमूर्त दुनिया में गड़बड़ी की आजादी मिलती है, लेकिन कभी-कभी वास्तविकता आपको निजी भागों में फँसती है और आपको बताती है कि वास्तव में एक ऐसे आदमी को खोजने के लिए जो वास्तव में समझता है। Ive बस उन अनुभवों में से एक था। मुझे लगता है कि कोले डेटा को सूची आइटम के रूप में सूचीबद्ध करने के लिए पर्याप्त है कि आप समझते हैं कि हमारे पास क्या है: Win2008 सर्वर 64 बिट पर्यावरण WPF अनुप्रयोग एक साथ कई ग्राहकों द्वारा उपयोग किया जाता है एक साथ आवेदन एक लांचर है, जो प्रक्रिया का उपयोग करते हुए अन्य अनुप्रयोग खोलता है। प्रारंभ () कभी-कभी हम संपादन 1 के नीचे अपवाद प्राप्त करें कुछ निरीक्षण के बाद, अधिक विस्तार से पता चलता है: लॉन्चिंग एक 2-कदम-प्रक्रिया है, लॉन्चर प्रक्रिया के माध्यम से एक मध्यवर्ती विंडो को लॉन्च करता है। WaitForExit () मध्यवर्ती खिड़की से, आगे की प्रक्रिया उसी तरह शुरू की जा सकती है (Process. WaitForExit)। केवल इंटरमीडिएट खिड़की खोलने और कोई उपयोगकर्ता इंटरैक्शन नहीं होने पर, समय के साथ लांचर प्रक्रिया संभाल की संख्या बढ़ जाती है यहां देखा गया अधिकतम वृद्धि 400 - 6000 हैंडल है संपादित करें में शामिल तथ्य वास्तव में मुझे आश्चर्य होता है कि कहीं ढांचे में संभाल रिसाव हो सकता है या नहीं। मैं समस्या को अलग करने की कोशिश कर रहा हूं और जांचता हूं कि क्या मैं इसे खरोंच से पुन: पेश कर सकता हूं। इस बीच, किसी भी प्रकार का संकेत, विचार, समर्थन या चॉकलेट को खुशी से 2 संपादित किया गया है। पोस्टमेस्ज () के लिए प्रक्रिया को उत्तरदायी बनाने के प्रयास में हमने धागा हटा दिया। इसके बजाय, हमने प्रक्रियाओं के लिए एक हेन्डलर से बाहर की घटना को जोड़ा और लॉन्चर को निम्न की तरह एक पाश में भेजा: एक्जिट-हेन्डलर सेट फू को झूठा और कुछ और नहीं करता है फिर भी, संभाल की संख्या बढ़ जाती है (आधे घंटे में 400 से 800) 3 संपादित करें यहां कुछ दिलचस्प है, आखिरकार यह उसे जिस तरीके से माना जाता है, कुछ संभालती है, सब निफ्टी अब मुझे आश्चर्य होता है कि यहाँ क्या गलत है। फिर से जांचने के लिए डेवलपर प्रभारी से बात करें कि लांचर क्या करता है। अब तक, मैंने सुना है कि यह XmlDocument. Load () का उपयोग करते हुए कुछ कॉन्फ़िगर मानों को पढ़ता है। जो एक IDisposable नहीं है - यह किसी भी रिसाव का निर्माण करने के लिए इसे कड़ी मेहनत करता है ओमनीट्रेड लाइब्रेरी के साथ 10 अप्रैल, 25 मैलस्टाज प्रक्रियाओं से पूछा: OmniThreadLibrary में OtlParallel यूनिट कुछ उच्च-स्तरीय समाधान प्रदान करता है जो आपको समानांतर में कुछ प्रकार की प्रक्रियाओं को आसानी से चलाने की अनुमति देता है। अब तक यह स्वयं-निहित पृष्ठभूमि गणना (समांतर। फ़्यूचर), स्वतंत्र समानांतर प्रक्रियाओं (समानांतर. जोइंड) और पाश गणनाओं का समर्थन करता है जहां पृष्ठभूमि कार्य स्टेटलेस है (यानी यह केवल इनपुट 8211 पर निर्भर करता है, लूप वैल्यू 8211 और गणना पर नहीं अन्य इनपुट 8211 लूप वैल्यू पर समानांतर। फोरेईक) लेकिन बहुत से समय में don8217t प्रक्रिया उन श्रेणियों में से किसी में आती है। मेसन व्हीलर ने हाल ही में मल्टीस्टेज प्रक्रियाओं के लिए समर्थन जोड़ने का सुझाव दिया। सप्ताहांत में I8217ve OmniThreadLibrary में इसे लागू किया है और अब यह परीक्षण आपके लिए परीक्षण शुरू करने के लिए तैयार है। मेसन के लिए उनके सुझाव के लिए और इसके कार्यान्वयन और नए पेश किए गए समानांतर की डिजाइन के लिए धन्यवाद. पीपलाइन धारणा यह है कि इस प्रक्रिया को चरणों (या सुपरसैसेस) में विभाजित किया जा सकता है, जो डेटा कतार से जुड़ा है। डेटा (वैकल्पिक) इनपुट कतार से पहले चरण में बहता है, जहां यह आंशिक रूप से संसाधित होता है और फिर मध्यस्थ कतार में निकला जाता है। पहला चरण तो निष्पादन जारी रहता है, अधिक इनपुट डेटा की प्रक्रिया करता है और अधिक आउटपुट डेटा आउटपुट करता है। जब तक पूरा इनपुट संसाधित नहीं होता तब तक यह जारी रहता है। मध्यस्थ कतार अगले चरण में जाता है जो प्रसंस्करण को इसी तरीके से और इतने पर और आगे बढ़ाता है। अंत में, डेटा एक कतार में आउटपुट होता है जिसे तब प्रोग्राम द्वारा पढ़ा और संसाधित किया जा सकता है जो इस multistage प्रक्रिया को बनाया। संपूर्ण रूप से, एक पाइपलाइन 8211 डेटा के रूप में एक multistage प्रक्रिया कार्य में आता है, डेटा बाहर आता है (और एक चमत्कार बीच में होता है)। यहां क्या महत्वपूर्ण बात यह है कि कोई अन्य स्टेज के साथ कोई स्टेज शेयर नहीं होता है। चरणों के बीच एकमात्र संपर्क मध्यस्थ कतारों के माध्यम से पारित किए गए डेटा के साथ किया जाता है। आंकड़ों की मात्रा, हालांकि, doesn8217t निरंतर होना चाहिए। एक चरण के लिए यह पूरी तरह से संभव है कि इनपुट पर प्राप्त की जाने वाली अधिक या कम डेटा उत्पन्न हो। एक शास्त्रीय एकल-थ्रेडेड प्रोग्राम में एक multistage प्रक्रिया के लिए निष्पादन योजना बहुत सरल है। मल्टी थ्रेड पर्यावरण में, हालांकि, हम इससे बेहतर कर सकते हैं। क्योंकि चरणों बड़े पैमाने पर स्वतंत्र हैं, उन्हें समानांतर में निष्पादित किया जा सकता है। कार्य और मध्यस्थ कतार की स्थापना एक काफी सरल है 8211 लेकिन तुच्छ 8211 प्रक्रिया से दूर है इसलिए यह सबसे अच्छा होगा अगर यह किसी तरह से स्वचालित हो सकता है। यह सामान्य विचार था कि मेसन मेरे साथ आया और साथ में हमने ओमनीट्रेट लाइब्रेरी 8211 समांतर. पीपलाइन का नया हिस्सा बनाया। समानांतर. पिपलाइन एक पाइपलाइन को समानांतर कॉल करके बनाया जाता है। पाइपलाइन फ़ंक्शन जो IOmniPipeline इंटरफ़ेस देता है। दो ओवरलोडेड संस्करण 8211 एक सामान्य पाइपलाइन बिल्डिंग के लिए और एक अन्य सरल पाइपलाइनों के लिए है, जो कि 8217t को विशेष कॉन्फ़िगरेशन की आवश्यकता होती है। उत्तरार्द्ध संस्करण दो पैरामीटर 8211 प्रसंस्करण चरणों और एक वैकल्पिक इनपुट कतार की एक सरणी लेता है। इनपुट कतार का उपयोग प्रथम चरण में आरंभिक डेटा प्रदान करने के लिए किया जा सकता है। यह इनपुट क्यूई पैरामीटर के लिए 8216nil8217 को पास करने के लिए पूरी तरह से मान्य है और बिना किसी इनपुट के प्रथम चरण को चलाता है। ब्लॉकिंग संग्रह समानांतर में डेटा कतार के लिए उपयोग किया जाता है.पीपलाइन कार्यान्वयन चरणों को अनाम प्रक्रियाओं, प्रक्रियाओं या विधियों के रूप में दो कतार मापदंडों 8211 एक इनपुट के लिए और आउटपुट के लिए एक ले के रूप में कार्यान्वित किया जाता है। पहले चरण में जहां इनपुट कतार को परिभाषित नहीं किया जा सकता है, दोनों स्वचालित रूप से पाइपलाइन कार्यान्वयन द्वारा बनाए गए हैं और मंच प्रतिनिधि को पास किए गए हैं। अगले कोड टुकड़ा कार्रवाई में साधारण पाइपलाइन फ़ंक्शन दिखाता है। यह OmniThreadLibrary परीक्षा 41Pipeline से लिया जाता है समानांतर. पीपलाइन मंच प्रतिनिधियों की एक सरणी को स्वीकार करती है और IOmniPipeline इंटरफ़ेस देता है। इसके बाद रनिंग को इन्फ्रास्ट्रक्चर पर बुलाया जाता है, बुनियादी ढांचे को स्थापित करने के लिए, सभी कार्य शुरू करें और आउटपुट कतार लौटाएं। मुख्य कार्यक्रम एक अंतिम परिणाम के लिए आखिरी चरण का इंतजार करता है और क्योंकि यह जानता है कि यह ठीक एक मूल्य का उत्पादन होगा, जो इसे अगले फ़ंक्शन (जिसे हाल ही में कार्यान्वित किया गया था और केवल ले फ़ंक्शन के आस-पास एक सरल आवरण) करके प्रतीक्षा कर सकता है। । IOmniPipeline इंटरफ़ेस की पूरी शक्ति आमतौर पर पैरासेलेलेस समानांतर के माध्यम से एक्सेस की जाती है.पीपलाइन फ़ंक्शन इनपुट इनपुट कतार सेट करता है अगर इसे नहीं कहा जाता है, तो इनपुट कतार को असाइन नहीं किया जाएगा और पहले चरण इनपुट पैरामीटर के लिए शून्य प्राप्त करेगा। स्टेज एक पाइपलाइन चरण जोड़ता है चरण कई पाइपलाइन चरण जोड़ते हैं। NumTasks चरण (एस) के लिए समानांतर निष्पादन कार्यों की संख्या निर्धारित करता है जो स्टेज (एस) फ़ंक्शन (IOW, कॉल स्टेज के बाद किया जाता है, जो कि ऐसा करने के लिए NumTasks है)। अगर किसी भी चरण को जोड़ा जाने से पहले इसे कहा जाता है, तो यह सभी चरणों के लिए डिफ़ॉल्ट निर्दिष्ट करेगा एक विशिष्ट चरण के लिए समानांतर निष्पादन कार्यों की संख्या फिर भी स्तम्भ के बाद नामक संख्याओं को कॉल करके ओवरराइड किया जा सकता है। अनुभाग में समानांतर निष्पादन के बारे में अधिक पढ़ें नीचे समानांतर चरण। थ्रॉटल चरण (एस) के लिए थ्रॉटलिंग मापदंडों को केवल स्टेज (फ़ंक्शन) के साथ जोड़ा गया है जैसे ही न्यूमैटस्क यह वैश्विक चूक या सिर्फ वर्तमान में जोड़ा गया चरण (एस) को प्रभावित करता है डिफ़ॉल्ट रूप से, थ्रॉटलिंग को 10240 तत्वों पर सेट किया गया है। अधिक जानकारी के लिए नीचे थ्रॉटलिंग अनुभाग देखें। रन सभी कड़ी मेहनत करता है 8211 कतार बनाता है और OmniThreadLibrary कार्यों को सेट करता है। यह आउटपुट कतार लौटाता है जिसे तब गणना के परिणाम प्राप्त करने के लिए आपके प्रोग्राम में उपयोग किया जा सकता है। यहां तक कि अगर अंतिम चरण में कोई भी परिणाम नहीं होता है, तो भी इस कतार को गणना के अंत में संकेत करने के लिए इस्तेमाल किया जा सकता है। जब प्रत्येक चरण समाप्त होता है, पूर्णएडिंग को स्वचालित रूप से आउटपुट कतार पर कहा जाता है। इससे इनपुट के अंत का पता लगाने के लिए अगले चरण की अनुमति मिलती है (ब्लॉकिंग संग्रह एंजीमेटर बाहर निकलता है या TryTake गलत लौटा देगा)। आउटपुट कतार के लिए भी वही चला जाता है एक उदाहरण (41 पाइपलाइन से भी लिया गया) यह सब समझाने में मदद करेगा। सबसे पहले, एक वैश्विक थ्रॉटलिंग पैरामीटर सेट किया गया है। यह सभी चरणों पर लागू किया जाएगा फिर दो चरण जोड़ दिए जाते हैं, प्रत्येक चरण समारोह में एक अलग कॉल के साथ। एक और दो चरणों फिर एक कॉल के साथ जोड़ रहे हैं वे दोनों दो समानांतर कार्यों में निष्पादित करने के लिए सेट हैं। अंत में एक और चरण जोड़ा जाता है और पूरी सेटअप निष्पादित होता है। पूरी प्रक्रिया सात कार्यों का उपयोग करेगी (एक स्टेज जनरेट के लिए, एक स्टेज मल्ट 2 के लिए। स्टेज मैनिस 3 के लिए दो, स्टेजमैोड 5 के लिए दो और स्टेजसम के लिए एक)। जनरेटर, म्यूटर्स, और समर्याकों Let8217 ने गहरे पानी के लिए एक मोड़ लेने से पहले, बहुप्रसारक चरणों के तीन अलग-अलग उदाहरणों पर एक नज़र डालें। पहला उदाहरण पहले चरण का एक उदाहरण है जो कोई इनपुट स्वीकार नहीं करता है और केवल उत्पादन उत्पन्न करता है जिसे श्रृंखला में अगले चरण में पारित किया जाता है। (सभी उदाहरणों को 41Pipeline से फिर से लिया गया है।) दूसरा उदाहरण इनपुट से डेटा पढ़ता है और प्रत्येक इनपुट के लिए एक आउटपुट मान उत्पन्न करता है और ट्रांसमीटर करता है। अंतिम उदाहरण इनपुट से डेटा पढ़ता है, सभी मूल्यों को एक साथ जोड़ता है और केवल एक सारांश मूल्य का उत्पादन करता है। सभी उदाहरण केवल सामान्य सिद्धांत 8211 के 8287 के विशेष मामलों हैं इनपुट डेटा की मात्रा और आउटपुट डेटा की मात्रा के बीच कोई संबंध नहीं है। वहां 8217 के भी बिल्कुल कोई आवश्यकता नहीं है कि डेटा सभी नंबरों होना चाहिए। कोमनी वैल्यू में जो कुछ भी शामिल किया जा सकता है, उसके चारों ओर से गुजरने के लिए स्वतंत्र महसूस करें। थ्रॉटलिंग मेरे टेस्ट केस (41 पीपललाइन) में बड़ी संख्या में डेटा (दस लाख संख्या) multistage प्रक्रिया के माध्यम से पारित हो जाता है यदि एक धागा कुछ समय 8211 के लिए निलंबित कर दिया गया है या यदि यह पिछले गणना के साथ धीमी गति वाली गणना करता है, तो यह धागा 8217 इनपुट कतार डेटा के साथ भर सकता है जिससे बहुत सारी स्मृति आवंटित हो सकती है और बाद में रिलीज़ हो सकती है। यहां तक कि डेटा प्रवाह के लिए, पाइपलाइन थ्रॉटलिंग का उपयोग करता है ब्लॉकिंग संग्रह में एक नई कार्यक्षमता। थ्रॉटलिंग ब्लॉकिंग कलेक्शन के अधिकतम आकार (टोम्नीवाले यूनिट्स) में सेट करता है। जब डेटा वस्तुओं की निर्दिष्ट राशि संग्रह में संग्रहीत होती है, तो कोई और डेटा जोड़ा नहीं जा सकता है। ऐड फ़ंक्शन केवल तब तक ब्लॉक होगा जब तक संग्रह फिर से खाली नहीं होता है या पूर्ण जोड़ा जाना कहा जाता है। संग्रह को खाली पर्याप्त माना जाता है जब डेटा गणना कुछ मान से कम हो जाती है जिसे थ्रॉटल फ़ंक्शन के दूसरे पैरामीटर के रूप में पारित किया जा सकता है या अधिकतम पैरामीटर सीमा के 34 के रूप में गणना की जाती है यदि दूसरा पैरामीटर नहीं दिया गया है। समानांतर चरणों आमतौर पर, एक कार्य पाइप लाइन में प्रत्येक चरण के लिए शुरू किया गया है। कुछ विशेष मामलों में, हालांकि, प्रत्येक चरण के लिए एक से अधिक समांतर कार्य को चलाने के लिए वांछनीय हो सकता है। इसका एक उदाहरण btnExtended2lick विधि में ऊपर दिया गया था। इस उदाहरण में उत्पन्न पाइपलाइन को निम्नलिखित आरेख के साथ प्रस्तुत किया जा सकता है। जैसा कि आप देख सकते हैं, वहां 8217 हमेशा चरण के बीच एक ही पंक्ति में बैठता है, भले ही एक मंच के लिए कई प्रसंस्करण इकाइयां हों। यह आसानी से IOmniBlockingCollection द्वारा कई पाठकों और एकाधिक लेखकों को एक धागा तरीके से समर्थन के द्वारा पूरा किया है। हालांकि, 8217 एक महत्वपूर्ण चेतावनी है, हालांकि। यदि आप एक चरण को कई कार्यों में विभाजित करते हैं, तो डेटा अनिश्चित क्रम में संसाधित किया जाएगा। आप नहीं जान सकते कि प्रत्येक कार्य द्वारा कितनी वस्तुओं पर कार्रवाई की जाएगी और किस क्रम पर उन्हें संसाधित किया जाएगा। भी बदतर 8211 डेटा अनिश्चित क्रम में मल्टीटास्क चरण से बाहर निकल जाएगा (एक काम से डेटा आउटपुट अन्य कार्य के डेटा के साथ दखल दिया जाएगा) इस समय के रूप में वहाँ 8217s मूल क्रम को लागू करने के लिए कोई रास्ता नहीं है क्योंकि यह समानांतर में किया जाता है। ForEach कार्यान्वयन पूरा या नहीं समानांतर. पीपलाइन प्रतिबद्ध और परीक्षण के लिए तैयार है, हालांकि, वे अभी भी कोड में कुछ quirks हो सकता है। I8217ll इसे परीक्षण या प्रदर्शन पर एक या दो के साथ पालन करें और आप तब तक प्रतीक्षा करना चाहें, जब तक आप इसका उपयोग शुरू करने से पहले नहीं कर सकते। अगर आप विकास के साथ मेरी मदद करना चाहते हैं, तो कृपया आगे बढ़ो, इसका इस्तेमाल करें और मुझे किसी भी समस्या की रिपोर्ट करें, या तो यहां टिप्पणी में या फ़ोरम में।
Comments
Post a Comment