टास्क और थ्रेड में क्या अंतर है?


378

सी # 4.0 में, हमारे पास Taskमें System.Threading.Tasks नाम स्थान। के बीच सच में क्या अंतर है Threadऔर Task। मैंने अपने स्वयं के सीखने के लिए कुछ नमूना कार्यक्रम (MSDN से मदद) लिया

Parallel.Invoke 
Parallel.For 
Parallel.ForEach 

लेकिन कई संदेह हैं क्योंकि विचार इतना स्पष्ट नहीं है।

मैंने शुरू में इसी प्रकार के प्रश्न के लिए स्टैकवॉटरफ़्लो में खोज की है, लेकिन इस प्रश्न के साथ हो सकता है कि मैं ऐसा नहीं कर पा रहा था। यदि किसी को उसी प्रकार के प्रश्न के बारे में पता है जो पहले यहां पोस्ट किया जा रहा है, तो कृपया लिंक का संदर्भ दें।


8
सूत्र कार्य चलाते हैं
pm100

जवाबों:


314

एक कार्य वह है जिसे आप करना चाहते हैं।

एक धागा कई संभावित श्रमिकों में से एक है जो उस कार्य को करता है।

.NET 4.0 शब्दों में, एक कार्य एक अतुल्यकालिक ऑपरेशन का प्रतिनिधित्व करता है। थ्रेड (ओं) का उपयोग उस ऑपरेशन को चंक्स में तोड़कर और अलग थ्रेड को असाइन करने के लिए किया जाता है।


क्या आप किसी कार्य को पूरा करने के लिए थ्रेड्स का अल्पविकसित उदाहरण प्रदान कर सकते हैं? मुझे नहीं पता कि क्या सूत्र वे काम कर रहे हैं जो एक-दूसरे के बीच स्वतंत्र हैं या वे कुछ टीमवर्क गणना करते हैं?
पेन्सम

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

451

कंप्यूटर विज्ञान के संदर्भ में, Taskएक भविष्य या एक वादा है । (कुछ लोग उन दो शब्दों का समान रूप से उपयोग करते हैं, कुछ उन्हें अलग तरह से उपयोग करते हैं, कोई भी सटीक परिभाषा पर सहमत नहीं हो सकता है ।) मूल रूप से, एक Task<T>"वादे" आपको वापस करने के लिए T, लेकिन अभी नहीं शहद, मैं थोड़े व्यस्त हूं, क्यों नहीं तुम बाद में लौट आना

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

विशेष रूप से, Taskयह नहीं कहता है कि ऐसा क्यों है कि मूल्य को वापस करने के लिए इतना लंबा समय लगता है। यह हो सकता है कि गणना करने में लंबा समय लगता है, या यह हो सकता है कि इसे लाने में लंबा समय लगता है। केवल पूर्व मामले में आप एक Threadचलाने के लिए एक का उपयोग करेंगे Task। (.NET में, थ्रेड्स महंगे हैं, इसलिए आप आम तौर पर इनसे जितना संभव हो उतना बचना चाहते हैं और वास्तव में इनका उपयोग केवल तब करते हैं जब आप कई सीपीयू पर कई भारी गणनाएँ चलाना चाहते हैं। उदाहरण के लिए, विंडोज में, एक धागे का वजन 12 KiBtete होता है। मुझे लगता है), लिनक्स में, एक धागा का वजन 4 KiByte से कम होता है, Erlang / BEAM में भी 400 बाइट होता है। .NET में, यह 1 MiByte है!)


29
दिलचस्प बात यह है कि TPL (टास्क पैरेलल लाइब्रेरी) के शुरुआती पूर्वावलोकन में टास्क और फ्यूचर <T> था। भविष्य <T> को फिर टास्क <T> का नाम दिया गया। :)
ली कैंपबेल

23
आपने .NET के लिए 1 MB की गणना कैसे की?
dvallejo

5
@DanVallejo: TPL डिजाइन टीम के साथ एक साक्षात्कार में उस संख्या का उल्लेख किया गया था। मैं आपको यह नहीं बता सकता कि यह किसने कहा या यह कौन सा साक्षात्कार था, मैंने उस साल पहले देखा था।
जोर्ग डब्ल्यू मित्तग

9
@RIPUNJAYTRIPATHI ज़रूर, लेकिन इसे एक और धागा होने की ज़रूरत नहीं है , यह वह धागा हो सकता है जिसने पहली जगह में काम करने का अनुरोध किया हो।
क्रिस पिटमैन

7
.NET सिर्फ विंडोज पर विंडोज थ्रेड्स का उपयोग करता है, इसलिए आकार समान है - डिफ़ॉल्ट रूप से, आमतौर पर दोनों के लिए वर्चुअल मेमोरी का 1 MiB। भौतिक स्मृति का उपयोग पृष्ठ-आकार की विखंडू (आमतौर पर 64 kiB) में किया जाता है, देशी कोड के साथ भी। उदाहरण के लिए, न्यूनतम थ्रेड स्टैक आकार OS पर निर्भर करता है - 256 kiB। X86 लिनक्स पर, डिफॉल्ट आमतौर पर 2 MiB होता है - फिर से, पृष्ठ-आकार के चनों में आवंटित किया जाता है। (सरलीकरण) एरलांग केवल एक सिस्टम थ्रेड प्रति प्रक्रिया का उपयोग करता है, उन 400 बाइट्स .NET के समान कुछ का उल्लेख करते हैं Task
लुआं

39

धागा

नंगे धातु की चीज, आपको शायद इसका उपयोग करने की आवश्यकता नहीं है, आप शायद एक LongRunningकार्य का उपयोग कर सकते हैं और टीपीएल से लाभ ले सकते हैं - टास्क समानांतर लाइब्रेरी, .NET फ्रेमवर्क 4 (फरवरी, 2002) और उससे ऊपर (भी .NET में शामिल हैं) कोर)।

कार्य

थ्रेड्स के ऊपर अमूर्त। यह थ्रेड पूल का उपयोग करता है (जब तक कि आप कार्य को LongRunningऑपरेशन के रूप में निर्दिष्ट नहीं करते हैं , यदि हां, तो आपके लिए हुड के तहत एक नया धागा बनाया गया है)।

धागा पूल

जैसा कि नाम से पता चलता है: थ्रेड्स का एक पूल। क्या .NET फ्रेमवर्क आपके लिए सीमित संख्या में थ्रेड संभाल रहा है। क्यों? क्योंकि सिर्फ 8 कोर वाले प्रोसेसर पर महंगे सीपीयू ऑपरेशन को अंजाम देने के लिए 100 धागे खोलना निश्चित रूप से अच्छा विचार नहीं है। फ्रेमवर्क आपके लिए इस पूल को बनाए रखेगा, थ्रेड का पुन: उपयोग करना (प्रत्येक ऑपरेशन में उन्हें बनाना / मारना नहीं), और उनमें से कुछ को समानांतर में निष्पादित करना, इस तरह से कि आपका सीपीयू जल न जाए।

ठीक है, लेकिन हर एक का उपयोग कब करें?

रिज्यूमे में: हमेशा कार्यों का उपयोग करें।

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

लेकिन ध्यान रखें कि:

  • I / O बाउंड : I / O बाउंड ऑपरेशंस के लिए (डेटाबेस कॉल, रीड / राइट फाइल्स, API कॉल, आदि) सामान्य कार्यों का उपयोग करने से बचें, LongRunningकार्यों का उपयोग करें ( या यदि आपको आवश्यकता हो तो थ्रेड )। क्योंकि कार्यों का उपयोग आपको थ्रेड पूल में ले जाएगा जिसमें कुछ धागे व्यस्त होंगे और बहुत से अन्य कार्य पूल को लेने के लिए अपनी बारी का इंतजार करेंगे।
  • सीपीयू बाउंड : सीपीयू बाउंड संचालन के लिए बस सामान्य कार्यों का उपयोग करें (जो आंतरिक रूप से थ्रेड पूल का उपयोग करेगा) और खुश रहें।

मामूली सुधार, एक धागा "नंगे-धातु की चीज" नहीं है। यह ओएस द्वारा कार्यान्वित किया जाता है, अधिकांश कार्यान्वयन सीपीयू और सीएस की सुविधाओं पर निर्भर करते हैं, लेकिन वे हार्डवेयर द्वारा कार्यान्वित नहीं किए जाते हैं।
तोमर डब्ल्यू

7

आप यह Taskनिर्दिष्ट करने के लिए उपयोग कर सकते हैं कि आप क्या करना चाहते हैं फिर Taskएक के साथ संलग्न करें Thread। ताकि GUI थ्रेड के बजाय Taskउस नए बने में निष्पादित किया जाएगा Thread

के Taskसाथ प्रयोग करें TaskFactory.StartNew(Action action)। यहां आप किसी प्रतिनिधि को निष्पादित करते हैं, इसलिए यदि आपने किसी धागे का उपयोग नहीं किया है तो इसे उसी धागे (GUI थ्रेड) में निष्पादित किया जाएगा। यदि आप किसी थ्रेड का उल्लेख करते हैं तो आप इसे Taskएक अलग थ्रेड में निष्पादित कर सकते हैं । यह एक अनावश्यक कार्य है, जिसके कारण आप सीधे प्रतिनिधि को निष्पादित कर सकते हैं या उस प्रतिनिधि को संलग्न कर सकते हैं और उस धागे में उस प्रतिनिधि को निष्पादित कर सकते हैं। इसलिए इसका उपयोग न करें। यह सिर्फ अनावश्यक है। यदि आप अपने सॉफ़्टवेयर को ऑप्टिमाइज़ करने का इरादा रखते हैं, तो इसे हटाने के लिए एक अच्छा उम्मीदवार है।

** कृपया ध्यान दें कि Actionयह एक है delegate


6

उपरोक्त बिंदुओं के अलावा, यह जानना अच्छा होगा कि:

  1. एक कार्य डिफ़ॉल्ट रूप से एक पृष्ठभूमि कार्य है। आपके पास अग्रभूमि कार्य नहीं हो सकता है। दूसरी ओर एक धागा पृष्ठभूमि या अग्रभूमि हो सकता है (व्यवहार बदलने के लिए IsBackground संपत्ति का उपयोग करें)।
  2. थ्रेड पूल में निर्मित कार्य उन थ्रेड को रीसायकल करते हैं जो संसाधनों को बचाने में मदद करते हैं। इसलिए ज्यादातर मामलों में कार्य आपकी डिफ़ॉल्ट पसंद होनी चाहिए।
  3. यदि ऑपरेशन जल्दी होते हैं, तो थ्रेड के बजाय किसी कार्य का उपयोग करना बेहतर होता है। लंबे समय तक चलने वाले संचालन के लिए, कार्य थ्रेड्स पर अधिक लाभ प्रदान नहीं करते हैं।

4

मैं आमतौर पर TaskWinforms और साधारण बैकग्राउंड वर्कर के साथ बातचीत करने के लिए उपयोग करता हूं ताकि यह UI को फ्रीज न कर सके। यहाँ एक उदाहरण है जब मैं उपयोग करना पसंद करता हूँTask

private async void buttonDownload_Click(object sender, EventArgs e)
{
    buttonDownload.Enabled = false;
    await Task.Run(() => {
        using (var client = new WebClient())
        {
            client.DownloadFile("http://example.com/file.mpeg", "file.mpeg");
        }
    })
    buttonDownload.Enabled = true;
}

वी.एस.

private void buttonDownload_Click(object sender, EventArgs e)
{
    buttonDownload.Enabled = false;
    Thread t = new Thread(() =>
    {
        using (var client = new WebClient())
        {
            client.DownloadFile("http://example.com/file.mpeg", "file.mpeg");
        }
        this.Invoke((MethodInvoker)delegate()
        {
            buttonDownload.Enabled = true;
        });
    });
    t.IsBackground = true;
    t.Start();
}

अंतर यह है कि आपको उपयोग करने की आवश्यकता नहीं है MethodInvokerऔर कम कोड है।


4

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

टास्क

धागा


3

एक टास्क को अतुल्यकालिक और समानांतर में कुछ निष्पादित करने के लिए एक सुविधाजनक और आसान तरीका के रूप में देखा जा सकता है।

आम तौर पर एक टास्क आप सभी की जरूरत है, मैं याद नहीं कर सकते कि क्या मैंने कभी प्रयोग के अलावा किसी और चीज के लिए एक धागा का उपयोग किया है।

आप एक कार्य के साथ एक थ्रेड (बहुत प्रयास के साथ) को पूरा कर सकते हैं।

धागा

int result = 0;
Thread thread = new System.Threading.Thread(() => { 
    result = 1; 
});
thread.Start();
thread.Join();
Console.WriteLine(result); //is 1

कार्य

int result = await Task.Run(() => {
    return 1; 
});
Console.WriteLine(result); //is 1

एक कार्य डिफ़ॉल्ट रूप से थ्रेडपूल का उपयोग करेगा, जो संसाधनों को बचाता है क्योंकि थ्रेड्स बनाना महंगा हो सकता है। आप टास्क को थ्रेड्स पर उच्च स्तर के अमूर्त रूप में देख सकते हैं।

जैसा कि यह लेख बताता है, कार्य थ्रेड पर शक्तिशाली विशेषताएं प्रदान करता है।

  • मल्टीकोर्स प्रोसेसर का लाभ उठाने के लिए कार्य को ट्यून किया जाता है।

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

  • टास्क एक परिणाम दे सकता है। थ्रेड से परिणाम वापस करने के लिए कोई प्रत्यक्ष तंत्र नहीं है।
  • सिग्नलिंग निर्माण के बिना, कार्यों के एक सेट पर प्रतीक्षा करें।

  • हम एक के बाद एक निष्पादित करने के लिए एक साथ कार्य श्रृंखला कर सकते हैं।

  • जब कोई कार्य किसी अन्य कार्य से प्रारंभ किया जाता है, तो माता-पिता / बच्चे के संबंध स्थापित करें।

  • बाल कार्य अपवाद मूल कार्य के लिए प्रचारित कर सकते हैं।

  • रद्दीकरण टोकन के उपयोग के माध्यम से टास्क समर्थन रद्दीकरण।

  • असिंक्रोनस कार्यान्वयन 'एसिंक्स' और 'वेट' कीवर्ड का उपयोग करके कार्य में आसान है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.