2011-11-21 14 views
6

मैं Task Parallel Library के बारे में पढ़ रहा था और लेख ने कहा: .NET फ्रेमवर्क 4 मेंक्या .NET 4.0 कार्य हमेशा बहु-थ्रेडेड अनुप्रयोगों के लिए पसंदीदा तरीका होना चाहिए?

, कार्य लेखन के लिए पसंदीदा एपीआई, मल्टी-थ्रेडेड अतुल्यकालिक, और समानांतर कोड

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

तो, कार्य किया जाना चाहिए कहीं भी एक से अधिक थ्रेड आवश्यक हैं?

उत्तर

4

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

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

उन लाभ इस तरह के किनारे मामलों है कि अच्छी तरह से क्रम सौदा नहीं करता है के रूप में संभावित detriments, पल्ला झुकना हैं, कुछ है कि मामला-दर-मामला विचार किया जाना चाहिए है। मैं निश्चित रूप से यहां जल्दी अनुकूलित करने की कोशिश नहीं करता, हालांकि।

+0

यह मेरी समझ है कि लंबे समय तक चलने वाले कार्यों धागे के लिए सबसे उपयुक्त हैं, जबकि छोटे कार्य थ्रेडपूल के लिए बेहतर हैं। अग्रभूमि बनाम पृष्ठभूमि का मुद्दा भी है। क्या कार्य वास्तव में पता लगाता है कि क्या कार्य पारित किया गया है, या यदि यह अग्रभूमि या पृष्ठभूमि होना चाहिए? मैं नहीं देखता कि यह कैसे हो सकता है। तो यह कैसे पूछ सकता है कि थ्रेडपूल सबसे अच्छा मार्ग है या नहीं? और यदि यह हमेशा थ्रेडपूल का उपयोग करता है, तो क्या थ्रेडपूल उपयुक्त नहीं होने पर कोई थ्रेड का उपयोग जारी रखना चाहिए? – Bob

+0

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

+0

देखें कि कार्य की लंबाई थ्रेडपूल प्रश्न से कैसे संबंधित है। एक थ्रेडपूल का उद्देश्य मनमानी कार्यों के साथ थ्रेड आवंटन का पुन: उपयोग करके धागे बनाने और मारने के ऊपरी हिस्से को कम करना है। लेकिन एक थ्रेडपूल थ्रेड्स का उपयोग करके कार्यान्वित किया जाता है, जो मध्यस्थ द्वारा प्रबंधित किया जाता है। मुझे यकीन नहीं है कि पूल में एक लंबा काम सौंपना वास्तव में एक नुकसान है, शायद यह थ्रेड प्रबंधन को कैसे प्रबंधित करता है। क्यू पर वापस, रनटाइम यह निर्धारित करने के आधार पर एक अधिक परिष्कृत दृष्टिकोण चुन सकता है कि यह सर्वोत्तम रणनीति है। यानी आप PostMessage का उपयोग करके Asynch को एक थ्रेड पर पूरा कर सकते हैं। – cunningdave

1

आप टीपीएल को बताने के संकेत के रूप में TaskCreationOptions.LongRunning का उपयोग कर सकते हैं कि आपका कार्य ThreadPool के मुकाबले ज्यादा जुड़ा हुआ हो सकता है। लेकिन, हां, टीपीएल मल्टीथ्रेड प्रोग्रामिंग के लिए पसंदीदा तरीका प्रतीत होता है। माइक्रोसॉफ्ट भी नए async और await खोजशब्द जो Async CTP में प्रस्तावित कर रहे हैं का समर्थन करने के लिए यह की चोटी पर बना रहा है। इसका मतलब यह नहीं है कि आपको पुरानी शैली Thread और ThreadPool एपीआई पूरी तरह से छोड़ना है। हालांकि, मैं व्यक्तिगत रूप से यह खोज रहा हूं कि टीपीएल अधिक से अधिक सुरुचिपूर्ण एपीआई में जो कुछ चाहता है वह करता है और मैं इसे लगभग पूरी तरह से भरोसा करता हूं।

0

एक टास्क एक धागा या एक ThreadPool से उच्चतर स्तर अमूर्त है। अनिवार्य रूप से आप एक कार्य में एक फ़ंक्शन को पैकेज करते हैं और रनटाइम से इसे जितना संभव हो उतना निष्पादित करने के लिए कहते हैं। यदि आपके पास कार्य की संख्या सीमित नहीं है तो सीमित संख्या में धागे द्वारा निष्पादित किए जाने पर आपके पास कई दर्जन हो सकते हैं।

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

कार्य समवर्ती प्रोग्रामिंग पैटर्न के कार्यान्वयन बहुत आसान बनाते हैं।ParallelExtensionExtras लाइब्रेरी प्रारंभ/एंडXXक्स जोड़े को उन कार्यों में परिवर्तित करने के तरीकों को प्रदान करती है जिन्हें जंजीर और कार्य पुनरावृत्ति मुहावरे का प्रारंभिक संस्करण बनाया जा सकता है जिसका उपयोग Async CTP द्वारा एसिंक/प्रतीक्षा वाक्यविन्यास प्रदान करने के लिए किया जाता है। आप समानांतर एक्स्टेंशन एक्स्ट्रा में AsyncCall उदाहरण के समान, नौकरियों की कतार बनाने के लिए कार्यों के एक समवर्ती चयन का उपयोग कर सकते हैं, या आगे भी जा सकते हैं और स्कैला, एरलांग या एफ # के समान एजेंट बना सकते हैं। असिंक सीटीपी में डेटाफ्लो अभी तक एक और उदाहरण है जिसे आप कार्यों के साथ बना सकते हैं।

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