টাস্ক এবং থ্রেডের মধ্যে পার্থক্য কী?


378

সি # 4.0, আমরা আছে Taskমধ্যে System.Threading.Tasks নামস্থান। মধ্যে সত্য পার্থক্য কি Threadএবং Task। আমি নিজের নিজের সাথে শেখার জন্য কিছু নমুনা প্রোগ্রাম (এমএসডিএন থেকে নেওয়া সাহায্য) করেছি

Parallel.Invoke 
Parallel.For 
Parallel.ForEach 

ধারণাটি এতটা পরিষ্কার না হওয়ায় অনেক সন্দেহ রয়েছে।

আমি প্রথম দিকে একই ধরণের প্রশ্নের জন্য স্ট্যাকওভারফ্লোতে অনুসন্ধান করেছি তবে এই প্রশ্নের শিরোনামের সাথে থাকতে পারে আমি একই পেতে সক্ষম হইনি। আগে যদি এখানে একই ধরণের প্রশ্ন পোস্ট করা হয় সে সম্পর্কে কেউ জানেন তবে দয়া করে লিঙ্কটির রেফারেন্স দিন।


8
থ্রেডগুলি কাজগুলি চালায়
বিকাল 100

উত্তর:


314

একটি কাজ এমন কিছু যা আপনি করতে চান।

একটি থ্রেড হ'ল সম্ভাব্য কর্মীদের মধ্যে একটি যা সেই কাজটি সম্পাদন করে।

.NET 4.0 পদগুলিতে, একটি কার্য একটি অ্যাসিনক্রোনাস অপারেশনকে উপস্থাপন করে। থ্রেড (গুলি) কাজটি খণ্ডগুলিতে ভেঙে আলাদা থ্রেডে বরাদ্দ করে সেই ক্রিয়াটি সম্পন্ন করতে ব্যবহৃত হয়।


কোনও কাজ শেষ করার জন্য থ্রেডের কাজ করার একটি প্রাথমিক উদাহরণ আপনি সরবরাহ করতে পারেন? আমি জানি না যে থ্রেডগুলি এমন কাজ করছে যা একে অপরের মধ্যে স্বতন্ত্র বা তারা কিছু দলগত গণনা করে?
পেনসাম

উভয় পরিস্থিতিই সম্ভব: একটি অনুকূল পরিস্থিতিতে থ্রেডগুলি অন্যান্য থ্রেডের সাথে সুসংগত করার প্রয়োজন ছাড়াই স্বতন্ত্র কাজ করে। অনুশীলনে, লকগুলি থ্রেড সমন্বয় করতে ব্যবহৃত হয়।
মিচ গম

451

কম্পিউটার বিজ্ঞানের ভাষায়, Taskএকটি ভবিষ্যত বা প্রতিশ্রুতি । (কিছু লোক এই দুটি শব্দ সমার্থকভাবে ব্যবহার করে, কেউ কেউ এগুলি আলাদাভাবে ব্যবহার করে, কোনও সঠিক সংজ্ঞা নিয়ে কেউ একমত হতে পারে না ।) মূলত, Task<T>"প্রতিশ্রুতি" দেয় আপনাকে ফিরিয়ে দেবার জন্য T, তবে এখনই মধু নয়, আমি কেন ব্যস্ত, কেন না তুমি কি পরে ফিরে আসবে?

Threadসেই প্রতিশ্রুতি পূরণের একটি উপায়। তবে প্রত্যেকেরই Taskএকেবারে নতুন প্রয়োজন হয় না Thread। (প্রকৃতপক্ষে, থ্রেড তৈরি করা প্রায়শই অযাচিত হয়, কারণ থ্রেডপুল থেকে বিদ্যমান থ্রেডটি পুনরায় ব্যবহার করার চেয়ে এটি করা অনেক বেশি ব্যয়বহুল that এক মুহুর্তে আরও বেশি)) আপনি যে মানটির জন্য অপেক্ষা করছেন সেটি যদি ফাইল সিস্টেম বা একটি থেকে আসে ডাটাবেস বা নেটওয়ার্ক, তারপরে কোনও থ্রেডের চারপাশে বসে থাকার দরকার নেই এবং যখন এটি অন্য অনুরোধগুলি পরিবেশন করতে পারে তখন ডেটার জন্য অপেক্ষা করুন। পরিবর্তে, Taskতারা প্রস্তুত হওয়ার পরে মানগুলি পেতে কলব্যাকটি রেজিস্টার করতে পারে।

বিশেষ করে, Taskনেই না বলে কেন এটা যে এটি মান ফেরত পাঠাতে যেমন একটি দীর্ঘ সময় লাগে। এটি হতে পারে যে এটি গণনা করতে দীর্ঘ সময় নেয়, বা এটি পেতে খুব বেশি সময় লাগে। শুধুমাত্র পূর্বের ক্ষেত্রে আপনি একটি Threadচালানোর জন্য একটি ব্যবহার করবেন Task। (নেট। ইন, থ্রেডগুলি ব্যয়বহুল হয়ে উঠছে, তাই আপনি সাধারণত এগুলি যথাসম্ভব এড়াতে চান এবং আপনি যদি একাধিক সিপিইউতে একাধিক ভারী গণনা চালাতে চান তবে কেবল সেগুলি ব্যবহার করুন example উদাহরণস্বরূপ, উইন্ডোজে, কোনও থ্রেডের ওজন 12 কিবিট হয় ( আমি মনে করি), লিনাক্সে, একটি থ্রেড ওজন 4 কিবাইট হিসাবে কম, এরলং / বিএমে এমনকি 400 বাইট এমনকি। নেট, এটি 1 মাইবাইট!)


29
মজার বিষয় হল টিপিএল (টাস্ক সমান্তরাল গ্রন্থাগার) এর প্রারম্ভিক পূর্বরূপ রিলিজগুলির মধ্যে টাস্ক এবং ফিউচার ছিল <T>। ভবিষ্যতে <T> এর পরে নামকরণ করা হয় টাস্ক <টি>। :)
লি ক্যাম্পবেল

23
কীভাবে আপনি নেট জন্য 1 এমবি গণনা করেছেন?
dvallejo

5
@ ড্যানভাল্লেজো: টিপিএল ডিজাইন দলের সাথে একটি সাক্ষাত্কারে এই সংখ্যাটি উল্লেখ করা হয়েছিল। কে বলেছে বা কোনটি সাক্ষাত্কার ছিল তা আমি আপনাকে বলতে পারি না, আমি কয়েক বছর আগে দেখেছি।
Jörg ডব্লু মিটাগ

9
@ রিপুনজায়ত্রিপাঠি অবশ্যই, তবে এটির অন্য থ্রেড হওয়ার দরকার নেই , এটি থ্রেড হতে পারে যা প্রথম স্থানে কাজটির অনুরোধ করেছিল।
ক্রিস পিটম্যান

7
.NET কেবল উইন্ডোজে উইন্ডোজের থ্রেড ব্যবহার করে, তাই আকারটি একই - ডিফল্টরূপে, সাধারণত উভয়ের জন্য 1 এমআইবি ভার্চুয়াল মেমরি থাকে। পৃষ্ঠা আকারের খণ্ডগুলিতে (সাধারণত ki৪ কিবি) প্রয়োজনীয় হিসাবে শারীরিক মেমরি ব্যবহার করা হয়, যা স্থানীয় কোডের সাথে একই। উদাহরণস্বরূপ, নূন্যতম থ্রেড স্ট্যাকের আকার ওএসের উপর নির্ভর করে - ভিস্তার জন্য 256 কিবি। X86 লিনাক্সে, ডিফল্টটি সাধারণত 2 মাইবি হয় - আবার পৃষ্ঠা-আকারের অংশগুলিতে বরাদ্দ। (সরলকরণ) এরলং প্রক্রিয়া অনুযায়ী কেবল একটি সিস্টেম থ্রেড ব্যবহার করে, সেই 400 বাইটগুলি নেট Task। নেটগুলির মতো কিছু বোঝায় ।
লুয়ান

39

সুতা

খালি ধাতব জিনিস, আপনার সম্ভবত এটি ব্যবহার করার দরকার নেই, আপনি সম্ভবত কোনও LongRunningটাস্ক ব্যবহার করতে পারেন এবং টিপিএল - টাস্ক প্যারালাল লাইব্রেরি,। নেট ফ্রেমওয়ার্ক 4 (ফেব্রুয়ারি, 2002) এবং উপরের (এছাড়াও। নেট) অন্তর্ভুক্ত থেকে সুবিধা নিতে পারেন মূল).

কাজ

থ্রেডগুলির উপরে বিমূর্ততা। এটি থ্রেড পুল ব্যবহার করে (আপনি যদি কোনও কাজ LongRunningঅপারেশন হিসাবে নির্দিষ্ট না করেন, যদি তা হয় তবে আপনার জন্য হুডের নীচে একটি নতুন থ্রেড তৈরি করা হবে)।

থ্রেড পুল

নাম হিসাবে প্রস্তাবিত: থ্রেডের একটি পুল। .NET ফ্রেমওয়ার্কটি আপনার জন্য সীমিত সংখ্যক থ্রেড পরিচালনা করছে। কেন? কারণ মাত্র 8 টি কোর দিয়ে একটি প্রসেসরে ব্যয়বহুল সিপিইউ অপারেশন চালানোর জন্য 100 টি থ্রেড খোলার বিষয়টি অবশ্যই ভাল ধারণা নয়। ফ্রেমওয়ার্কটি আপনার জন্য এই পুলটি বজায় রাখবে, থ্রেডগুলি পুনরায় ব্যবহার করে (প্রতিটি ক্রিয়াকলাপে সেগুলি তৈরি / হত্যা না করে) এবং কিছুগুলিকে সমান্তরালে চালিত করবে যাতে আপনার সিপিইউ জ্বলে না।

ঠিক আছে, কিন্তু যখন প্রতিটি ব্যবহার করবেন?

পুনরায় শুরুতে: সর্বদা কার্যাদি ব্যবহার করুন।

টাস্ক একটি বিমূর্ততা, তাই এটি ব্যবহার করা অনেক সহজ। আমি আপনাকে সর্বদা কাজগুলি ব্যবহার করার চেষ্টা করার পরামর্শ দিচ্ছি এবং যদি আপনি এমন কোনও সমস্যার মুখোমুখি হন যা আপনাকে নিজের দ্বারা একটি থ্রেড পরিচালনা করতে হবে (সম্ভবত সময়ের 1%) তবে থ্রেডগুলি ব্যবহার করুন।

তবে সচেতন থাকুন যে:

  • ইনপুট / আউটপুট বাউন্ড : ইনপুট / আউটপুট আবদ্ধ অপারেশন (ডাটাবেস কল, পড়া / লেখা ফাইল, API গুলি কল, ইত্যাদি) স্বাভাবিক কাজগুলো ব্যবহার করবেন না, ব্যবহারের জন্য LongRunningকাজের (যেমন বা থ্রেড আপনাকে প্রয়োজন হলে )। কারণ টাস্ক ব্যবহার করা আপনাকে কয়েকটি থ্রেডে ব্যাস্ত এবং অনেকগুলি কাজ পুলে নিয়ে যাওয়ার জন্য অপেক্ষা করে এমন একটি থ্রেড পুলে নিয়ে যায়।
  • সিপিইউ বাউন্ড : সিপিইউ বাউন্ড অপারেশনের জন্য কেবলমাত্র সাধারণ কাজগুলি (যা অভ্যন্তরীণভাবে থ্রেড পুল ব্যবহার করবে) ব্যবহার করুন এবং খুশি হন।

সামান্য সংশোধন, একটি থ্রেড একটি "বেয়ার-মেটাল জিনিস" নয়। এটি ওএস দ্বারা প্রয়োগ করা হয়, বেশিরভাগ বাস্তবায়ন সিপিইউ এবং সিএস এর বৈশিষ্ট্যগুলিতে রিলে করে তবে এগুলি হার্ডওয়ার দ্বারা প্রয়োগ করা হয় না।
টোমর ডব্লিউ

7

আপনি Taskযা করতে চান তা নির্দিষ্ট করতে আপনি এটির Taskসাথে একটি সংযুক্ত করতে পারেন Thread। সুতরাং এটি জিইউআই থ্রেডের পরিবর্তে Taskসদ্য তৈরি Threadহওয়াতে কার্যকর করা হবে ।

সাথে ব্যবহার Taskকরুন TaskFactory.StartNew(Action action)। এখানে আপনি একটি প্রতিনিধি কার্যকর করেছেন সুতরাং আপনি যদি কোনও থ্রেড ব্যবহার না করেন তবে এটি একই থ্রেডে (জিইউআই থ্রেড) কার্যকর করা হবে। যদি আপনি কোনও থ্রেড উল্লেখ করেন তবে আপনি এটি অন্য থ্রেডে চালিত করতে পারেন Task। এটি একটি অপ্রয়োজনীয় কাজের কারণ আপনি সরাসরি ডেলিগেটকে কার্যকর করতে পারেন বা সেই প্রতিনিধিটিকে একটি থ্রেডে সংযুক্ত করতে পারেন এবং সেই থ্রেডে সেই প্রতিনিধিটিকে কার্যকর করতে পারেন। সুতরাং এটি ব্যবহার করবেন না। এটা শুধু অপ্রয়োজনীয়। আপনি যদি নিজের সফ্টওয়্যারটি অপ্টিমাইজ করতে চান তবে এটি সরানো ভাল প্রার্থী।

** দয়া করে নোট করুন যে এটি Actionএকটি delegate


6

উপরের বিষয়গুলি ছাড়াও, এটি জেনে রাখা ভাল হবে:

  1. কোনও কাজ হ'ল ডিফল্টরূপে একটি ব্যাকগ্রাউন্ড টাস্ক। আপনার কোনও অগ্রভাগের কাজ থাকতে পারে না। অন্যদিকে একটি থ্রেড পটভূমি বা অগ্রভাগ হতে পারে (আচরণ পরিবর্তন করতে ইসব্যাকগ্রাউন্ড সম্পত্তি ব্যবহার করুন)।
  2. থ্রেড পুলে তৈরি কার্যগুলি থ্রেডগুলিকে পুনর্ব্যবহার করে যা সংস্থানগুলি বাঁচাতে সহায়তা করে। সুতরাং বেশিরভাগ ক্ষেত্রে কাজগুলি আপনার ডিফল্ট পছন্দ হওয়া উচিত।
  3. যদি অপারেশনগুলি দ্রুত হয় তবে থ্রেডের পরিবর্তে কোনও টাস্ক ব্যবহার করা আরও ভাল। দীর্ঘ চলমান ক্রিয়াকলাপগুলির জন্য, কার্যগুলি থ্রেডগুলির চেয়ে বেশি সুবিধা সরবরাহ করে না।

4

আমি সাধারণত Taskউইনফর্মগুলি এবং সাধারণ পটভূমির কর্মীদের সাথে আলাপচারিতা ব্যবহার করে এটি ইউআই জমাটবদ্ধ না করে তোলে। আমি উদাহরণ পছন্দ করি যখন আমি ব্যবহার পছন্দ করি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

কোনও কাজ ডিফল্টভাবে থ্রেডপুল ব্যবহার করবে, যা থ্রেড তৈরি করা ব্যয়বহুল হতে পারে বলে সংস্থানগুলি সঞ্চয় করে। থ্রেডের উপর একটি উচ্চ স্তরের বিমূর্তি হিসাবে আপনি কোনও কার্য দেখতে পাচ্ছেন।

এই নিবন্ধটি হিসাবে উল্লেখ করা হয়েছে, টাস্ক থ্রেড উপর নিম্নলিখিত শক্তিশালী বৈশিষ্ট্য সরবরাহ করে।

  • মাল্টিকোরস প্রসেসরের উপকারের জন্য কার্যগুলি টিউন করা হয়।

  • যদি সিস্টেমটির একাধিক কাজ থাকে তবে এটি সিএলআর থ্রেড পুল অভ্যন্তরীণভাবে ব্যবহার করে এবং তাই থ্রেড ব্যবহার করে একটি উত্সর্গীকৃত থ্রেড তৈরির সাথে ওভারহেড যুক্ত হয় না। একাধিক থ্রেডের মধ্যে প্রসঙ্গের স্যুইচিং সময়কেও হ্রাস করুন।

  • টাস্ক একটি ফলাফল ফিরে আসতে পারে thread
  • সিগন্যালিং কন্সট্রাক্ট ছাড়াই কোনও কাজের সেট নিয়ে অপেক্ষা করুন।

  • আমরা একের পর এক কার্য সম্পাদন করতে এক সাথে কাজগুলি শৃঙ্খলা করতে পারি।

  • যখন একটি কাজ অন্য কাজ থেকে শুরু হয় তখন পিতামাতার / সন্তানের সম্পর্ক স্থাপন করুন।

  • চাইল্ড টাস্ক ব্যতিক্রম পিতামাতার টাস্কে প্রচার করতে পারে।

  • বাতিল টোকেন ব্যবহারের মাধ্যমে টাস্ক সমর্থন বাতিলকরণ।

  • 'অ্যাসিঙ্ক' এবং 'অপেক্ষা' কীওয়ার্ড ব্যবহার করে অ্যাসিঙ্ক্রোনাস বাস্তবায়ন কার্যক্রমে সহজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.