2012-02-29 6 views
19

के बीच अंतर टास्क & के बीच अंतर के बारे में जो मैं समझता हूं उससे थ्रेड यह है कि यह कार्य थ्रेड-पूल में हुआ था, जबकि धागा ऐसा कुछ है जिसे मुझे स्वयं प्रबंधित करने की आवश्यकता है .. (और उस कार्य को रद्द कर दिया जा सकता है और अपने मिशन के अंत में थ्रेड-पूल पर वापस जा सकता है)कार्य (सिस्टम। थ्रेडिंग टास्क) और थ्रेड

लेकिन कुछ ब्लॉग में मैंने पढ़ा है कि यदि ऑपरेटिंग सिस्टम को कार्य बनाने और थ्रेड बनाने की आवश्यकता है => इसे बनाना आसान होगा (और नष्ट) कार्य।

कोई भी समझा सकता है कि कार्य क्यों बनाना आसान है धागा?

(या शायद मैं कुछ यहाँ याद आ रही ...)

+17

* नौकरी * और * कार्यकर्ता * के बीच क्या अंतर है? एक कार्यकर्ता * एक नौकरी करता है; एक कर्मचारी * नौकरी * नहीं है। कुछ नौकरियां एक ही कार्यकर्ता द्वारा की जाती हैं; कुछ नौकरियां छोटे नौकरियों में विभाजित होती हैं जो सभी काम करने वाले कई श्रमिकों द्वारा की जाती हैं। कार्यों और धागे के साथ ही; एक कार्य * धागा का एक प्रकार नहीं है *; एक काम एक नौकरी है, और एक धागा एक कार्यकर्ता है जो नौकरी करता है। –

+3

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

उत्तर

20

के लिए समानांतर libray मैं लगता कि तुम किस बारे में जब आप कहते हैं टास्क एक System.Threading.Task है बात कर रहे हैं ले लो। यदि ऐसा है तो आप इसके बारे में इस बारे में सोच सकते हैं:

  • एक प्रोग्राम में कई धागे हो सकते हैं, लेकिन एक प्रोसेसर कोर केवल एक समय में एक थ्रेड चला सकता है।
    • धागे हैं बहुत महंगा है, और धागे चलाने वाले के बीच स्विच भी बहुत महंगा है।
    • तो ... सामान करने वाले हजारों धागे अक्षम हैं। कल्पना करें कि क्या आपके शिक्षक ने आपको 10,000 कार्य करने के लिए दिया है। आप उनके बीच इतनी साइकल चलाना चाहते हैं कि आप कभी भी कुछ नहीं करेंगे। यदि आप बहुत सारे धागे शुरू करते हैं तो सीपीयू के साथ भी यही बात हो सकती है।

इस के आसपास पाने के लिए, .NET फ़्रेमवर्क आप कार्य बनाने के लिए अनुमति देता है। कार्य एक वस्तु में बंडल किए गए काम का थोड़ा सा काम है, और वे आपको उस काम के उत्पादन और चेन के टुकड़ों को एक साथ पकड़ने जैसी रोचक चीजें करने की अनुमति देते हैं (पहले स्टोर पर जाएं, फिर एक पत्रिका खरीदें)।

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

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

+3

'कार्य को डिफ़ॉल्ट रूप से' थ्रेडपूल' पर निर्धारित किया गया है, लेकिन उन्हें होना जरूरी नहीं है। यदि आप 'कार्य पूर्णीकरण स्रोत' का उपयोग करके इसे बनाते हैं, तो 'टास्क' से सीधे कोई भी कोड संबद्ध नहीं हो सकता है। – svick

11

आप कार्य के दो विभिन्न विचार सुनवाई कर रहे हैं। पहला नौकरी की धारणा है, और दूसरी प्रक्रिया की धारणा है।

बहुत समय पहले (कंप्यूटर शर्तों में), कोई धागे नहीं थे। किसी प्रोग्राम के प्रत्येक चलने वाले उदाहरण को एक प्रक्रिया कहा जाता था, क्योंकि यह बाहर निकलने तक दूसरे के बाद एक कदम के बाद बस एक कदम करता था। यह एक फैक्ट्री असेंबली लाइन की तरह चरणों की एक श्रृंखला के रूप में एक प्रक्रिया के अंतर्ज्ञानी विचार से मेल खाता है। ऑपरेटिंग सिस्टम प्रक्रिया abstraction का प्रबंधन करता है।

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

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

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

+1

+1 यह एक अच्छा स्पष्टीकरण है। मुझे लगता है कि ओपी 'सिस्टम। थ्रेडिंग टास्क' के बारे में बात कर रहा है। यह अच्छा होगा अगर आप टीपीएल की बारीकियों को शामिल करने के लिए चर्चा को थोड़ा और बढ़ा सकते हैं। –

2

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

+0

क्रिस, क्या आप निर्धारित कार्य के बारे में समझा सकते हैं? – Yanshof

+1

मैं एक उत्तर जोड़ूंगा, लेकिन मैं आपको @ AdamMihalcin के उत्तर –

+0

@ChrisShain पर भी निर्देशित करूंगा। मैं सहमत हूं कि कार्य धागे पर निर्धारित हैं, और यह संकेत देने की कोशिश नहीं कर रहे थे कि धागे कार्य के समान हैं, लेकिन वही विकास लक्ष्य पूरा कर रहे हैं हो सकता है कि मेरी व्याख्या थोड़ा सामान्यीकृत हो ... –

8

थ्रेड्स v1.0 से नेट का हिस्सा रहा है, टास्क समांतर लाइब्रेरी टीपीएल में कार्य पेश किए गए थे जिन्हें नेट 4.0 में रिलीज़ किया गया था।

आप एक कार्य को थ्रेड के एक अधिक परिष्कृत संस्करण के रूप में विचार कर सकते हैं। वे उपयोग करने में बहुत आसान हैं और थ्रेड पर बहुत से फायदे हैं:

  1. आप कार्य प्रकारों को कार्य में बना सकते हैं जैसे कि वे कार्य कर रहे हैं।
  2. आप "जारी रखें" विधि कर सकते हैं, जो पिछले कार्य की प्रतीक्षा करेगा और फिर निष्पादन शुरू करेगा। (सार का इंतजार)
  3. सार तत्व ताले जो मेरी कंपनी की guidlines के अनुसार टालना चाहिए।
  4. आप कार्य का उपयोग कर सकते हैं। प्रतीक्षा करें और कार्यों की एक सरणी पारित करें ताकि आप सभी कार्यों को पूरा होने तक प्रतीक्षा कर सकें।
  5. आप कार्य को मूल कार्य में संलग्न कर सकते हैं, इस प्रकार आप यह तय कर सकते हैं कि माता-पिता या बच्चा पहले मौजूद होगा या नहीं।
  6. आप LINQ क्वेरीज़ के साथ डेटा समांतरता प्राप्त कर सकते हैं।
  7. आप समानांतर और foreach loops
  8. कार्यों के साथ अपवादों को संभालने में बहुत आसान बना सकते हैं।
  9. * सबसे महत्वपूर्ण बात यह है कि यदि एक ही कोड एकल कोर मशीन पर चलाया जाता है तो यह थ्रेड के किसी भी ओवरहेड के बिना एक प्रक्रिया के रूप में कार्य करेगा। धागे से अधिक कार्यों की

नुकसान:

  1. आप नेट 4.0
  2. नए चेहरे हैं, जो ऑपरेटिंग सिस्टम सीखा है धागे बेहतर समझ सकते हैं की जरूरत है।
  3. ढांचे के लिए नया इतना अधिक सहायता उपलब्ध नहीं है।

कुछ टिप्स: - हमेशा कार्य का उपयोग करें। फैक्टरी.स्टार्टन्यू विधि जो अर्थात् पूर्ण और मानक है।

टास्क पर एक नज़र में अधिक जानकारी के http://msdn.microsoft.com/en-us/library/dd460717.aspx

3

एरिक Lippert द्वारा टिप्पणी पर विस्तार:

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

Task, दूसरी ओर कुछ नौकरी की एक अमूर्त धारणा का प्रतिनिधित्व करता है। उस नौकरी का परिणाम हो सकता है, और आप नौकरी खत्म होने तक प्रतीक्षा कर सकते हैं (Wait() पर कॉल करके) या कहें कि नौकरी समाप्त होने के बाद आप कुछ करना चाहते हैं (ContinueWith() पर कॉल करके)।

सबसे सामान्य नौकरी जिसे आप प्रतिनिधित्व करना चाहते हैं, वर्तमान कोड के साथ समानांतर में कुछ गणना करना है। और Task आपको ऐसा करने का एक आसान तरीका प्रदान करता है। वास्तव में कोड कब और कब TaskScheduler द्वारा परिभाषित किया जाता है। डिफ़ॉल्ट एक ThreadPool का उपयोग करता है: थ्रेड का एक सेट जो किसी भी कोड को चला सकता है। ऐसा इसलिए किया जाता है क्योंकि अक्षमता में धागे बनाना और स्विच करना।

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

आप जब उपयोग करने के लिए जानना चाहते हैं Task और Thread उपयोग करने के लिए जब: Task उपयोग करने के लिए सरल और अधिक कुशल अपनी खुद की Thread रों बनाने है। लेकिन कभी-कभी, आपको Task द्वारा प्रदान की जाने वाली चीज़ों की तुलना में अधिक नियंत्रण की आवश्यकता होती है। उन मामलों में, यह Thread का उपयोग करने के लिए सीधे समझ में आता है।