থ্রেড বনাম থ্রেডপুল


137

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

উত্তর:


110

থ্রেড পুলটি ঘন ঘন এবং তুলনামূলকভাবে সংক্ষিপ্ত ক্রিয়াকলাপগুলির জন্য সুবিধা প্রদান করবে

  • নতুন থ্রেড তৈরি করার পরিবর্তে থ্রেডগুলি পুনরায় ব্যবহার করা হয়েছে (একটি ব্যয়বহুল প্রক্রিয়া)
  • যখন নতুন কাজের আইটেমগুলির জন্য অনুরোধগুলি ফেটে যায় তখন থ্রেড তৈরির হারকে কমিয়ে দেওয়া হয় (আমি বিশ্বাস করি এটি কেবল নেট। 3.5 এ রয়েছে)

    • যদি আপনি 100 থ্রেড পুলের কাজগুলি সারি করেন, তবে এটি কেবলমাত্র এই অনুরোধগুলি পরিবেশন করতে ইতিমধ্যে তৈরি হওয়া থ্রেডগুলি ব্যবহার করবে (উদাহরণস্বরূপ 10 বলুন)। থ্রেড পুলটি ঘন ঘন চেক করবে (আমি বিশ্বাস করি প্রতি 500 মিমি 3.5 এসপি 1 তে) এবং যদি সারি কাজ থাকে তবে এটি একটি নতুন থ্রেড তৈরি করবে। যদি আপনার কাজগুলি দ্রুত হয়, তবে নতুন থ্রেডের সংখ্যা ছোট হবে এবং 10 বা নতুন ব্যবহারগুলি সংক্ষেপে সামান্য কাজগুলির জন্য 100 টি থ্রেড তৈরির চেয়ে দ্রুত হবে।

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

    • থ্রেড পুলটি কীভাবে হুডের নীচে কাজ করে সে সম্পর্কে গভীরতার তথ্যের জন্য এখানে চেক করুন

কাজটি তুলনামূলকভাবে দীর্ঘস্থায়ী হতে চলতে থাকলে নিজেই নতুন থ্রেড তৈরি করা আরও উপযুক্ত হবে (সম্ভবত এটি এক-দু'র কাছাকাছি হলেও এটি নির্দিষ্ট পরিস্থিতির উপর নির্ভর করে)

@ ক্রিজিসটফ - থ্রেড পুলের থ্রেডগুলি ব্যাকগ্রাউন্ড থ্রেড যা মূল থ্রেড শেষ হয়ে গেলে থামবে। ম্যানুয়ালি তৈরি থ্রেডগুলি পূর্বনির্ধারিতভাবে অগ্রভাগ হয় (মূল থ্রেডটি শেষ হওয়ার পরে চলতে থাকবে) তবে সেগুলি শুরু করার আগে পটভূমিতে সেট করা যেতে পারে।


5
কেবলমাত্র আমি যে বিষয়টি নিয়ে ভাবছি তা হল এমএসডিএন (এমএসডিএন.মাইক্রোসফট.টেন / লিসার /1 c9txz50.aspx ) এর নিম্নলিখিত বিবৃতিটি হ'ল "একটি পটভূমি থ্রেড কেবল তখনই কার্যকর করা হয় যখন প্রবর্তনকারী থ্রেডগুলির সংখ্যা প্রসেসরের সংখ্যার চেয়ে কম হয় । "। সুতরাং তার মানে কি এই যে অগ্রভাগের থ্রেডগুলি অগ্রাধিকার পায় এমন কোরগুলির মধ্যে কাজ করার সময়?
সিডিগিংস

1
The আপনি থ্রেড পুল থেকে কোনও থ্রেড বাতিল বা আটকাতে পারবেন না। Thread আপনি থ্রেড পুল থেকে কোনও থ্রেডে যোগ দিতে পারবেন না। এটি অর্জন করতে, আপনাকে অবশ্যই কিছু অন্যান্য প্রক্রিয়া ব্যবহার করতে হবে
জিনভ

14

.NET পরিচালিত থ্রেডপুল: -

  • বর্তমান কাজের চাপ এবং উপলব্ধ হার্ডওয়ারের উপর ভিত্তি করে নিজেই আকারগুলি
  • কর্মী থ্রেড এবং সমাপ্তি বন্দর থ্রেড (যা IO পরিষেবাতে বিশেষত ব্যবহৃত হয়) রয়েছে
  • অপেক্ষাকৃত স্বল্প-কালীন ক্রিয়াকলাপের জন্য বৃহত সংখ্যার জন্য অনুকূলিত

অন্যান্য থ্রেড পুল বাস্তবায়ন বিদ্যমান যা দীর্ঘ-চলমান ক্রিয়াকলাপগুলির জন্য আরও উপযুক্ত be

বিশেষত, আপনার অ্যাপ্লিকেশনটিকে অনেক বেশি থ্রেড তৈরি হতে আটকাতে একটি থ্রেড পুল ব্যবহার করুন । থ্রেডপুলের সর্বাধিক গুরুত্বপূর্ণ বৈশিষ্ট্য হ'ল কাজের সারি। এটি হ'ল একবার আপনার মেশিনটি পর্যাপ্ত ব্যস্ত হয়ে গেলে থ্রেডপুলটি তত্ক্ষণাত আরও থ্রেড স্প্যান না করে অনুরোধগুলি সারি করবে।

সুতরাং, আপনি যদি একটি ছোট, সীমিত সংখ্যক থ্রেড তৈরি করেন তবে সেগুলি সেগুলি নিজেই তৈরি করে। আপনি কতগুলি থ্রেড তৈরি হতে পারে তা আপ-ফ্রন্ট নির্ধারণ করতে না পারছেন (যেমন আগত আইওর প্রতিক্রিয়াতে সেগুলি তৈরি করা হয়েছে) এবং তাদের কাজটি স্বল্পস্থায়ী হবে, থ্রেডপুলটি ব্যবহার করুন। আপনি যদি না জানেন তবে কতগুলি তাদের কাজ দীর্ঘস্থায়ী হবে, প্ল্যাটফর্মে আপনাকে সহায়তা করার মতো কিছুই নেই - তবে আপনি বিকল্প থ্রেডপুল বাস্তবায়নগুলি উপযুক্ত যেগুলি এটি পেতে পারেন।


.NET- এ, আপনি কি থ্রেড পুল ছাড়াই সমাপ্তি বন্দর ব্যবহার করতে পারেন? আমি অনুমানের মধ্যে ছিলাম যে অ্যাসিঙ্ক আই / ও পদ্ধতিগুলিই ছিল একমাত্র উপায় (। নেট) এবং তারা থ্রেড পুলটি ব্যবহার করে
কার্গ

10

এছাড়াও

new Thread().Start()

ফোরগ্রাউন্ড থ্রেড স্প্যান করে যা আপনি আপনার প্রোগ্রামটি বন্ধ করে দিলে মারা যায় না। থ্রেডপুলের থ্রেডগুলি হ'ল ব্যাকগ্রাউন্ড থ্রেড যা আপনি অ্যাপটি বন্ধ করে দিলে মারা যায়।


11
আপনি সর্বদা পটভূমিতে একটি থ্রেড সেট করতে পারেন। এগুলি ডিফল্টরূপে কেবল অগ্রভাগ।
ক্রিস এরিকসন

3
নিমো: বর্ণ টি = নতুন থ্রেড (...); t.BackgroundThread = সত্য; t.Start ();
রিকার্ডো আমোরস

18
"প্রোগ্রাম" শব্দটি সম্পর্কে স্পষ্টতা। একটি ডেস্কটপ অ্যাপ্লিকেশন একটি প্রক্রিয়াতে চলমান, এবং কমপক্ষে একটি অগ্রভাগ থ্রেড থাকে যা ইউআই পরিচালনা করে। অগ্রণী থ্রেড রয়েছে যতক্ষণ না এই প্রক্রিয়াটি চলতে থাকবে। আপনি যখন কোনও ডেস্কটপ অ্যাপ্লিকেশনটি বন্ধ করেন, অগ্রভাগ UI থ্রেড বন্ধ হয়ে যায়, তবে এটির অন্যান্য অগ্রভাগের থ্রেডগুলি থাকলে প্রক্রিয়াটি অগত্যা আপনি বন্ধ করেন নি ।
জি-উইজ

8

আমি এগুলির জন্য আপেক্ষিক উত্স ব্যবহার সম্পর্কে কৌতূহল ছিলাম এবং আমার ২০১২ ডুয়াল-কোর ইন্টেল আই 5 ল্যাপটপের উপর একটি বেঞ্চমার্ক চালিয়েছিলাম। উইন্ডোজ 8. নেট 4.0 রিলিজ ব্যবহার করে থ্রেড পুলগুলি গড়ে শুরু করতে গড়ে 0.035ms নিয়েছে যেখানে থ্রেডস গড়ে 5.06 পেয়েছে মাইক্রোসফট. অন্য কথায় বড় সংখ্যক স্বল্পস্থায়ী থ্রেডের জন্য পুলের থ্রেডটি প্রায় 300x দ্রুত শুরু হয়েছিল। কমপক্ষে পরীক্ষিত ব্যাপ্তিতে (100-2000) থ্রেডে মোট থ্রেড সময়টি বেশ ধ্রুব বলে মনে হয়েছিল।

এটি সেই কোড যা বেঞ্চমার্ক করা হয়েছিল:

    for (int i = 0; i < ThreadCount; i++) {
        Task.Run(() => { });
    }

    for (int i = 0; i < ThreadCount; i++) {
        var t = new Thread(() => { });
        t.Start();
    }

এখানে চিত্র বর্ণনা লিখুন


5
আমার মনে হয় এটি হ'ল কারণ থ্রেডপুল নতুন তৈরির পরিবর্তে তৈরি থ্রেডগুলি পুনরায় ব্যবহার করেছে (যা অনেক বেশি ব্যয়বহুল)
19:34 এ 19:37 এ

3

পূর্ববর্তী থ্রেডের জন্য এখানে চেক করুন:

কখন নেট। এ থ্রেডপুল ব্যবহার করা উচিত নয়?

সংক্ষিপ্তসারটি হ'ল থ্রেডপুল ভাল হয় যদি আপনার অনেকগুলি শর্টলিভড থ্রেড স্প্যান করতে হয় তবে থ্রেডগুলি ব্যবহার করা আপনাকে আরও কিছুটা নিয়ন্ত্রণ দেয়।


1

থ্রেড পুল সহ থ্রেড লোকাল স্টোরেজটি ভাল ধারণা নয়। এটি থ্রেডগুলিকে একটি "পরিচয়" দেয়; সমস্ত থ্রেড আর সমান নয়। এখন থ্রেড পুলগুলি বিশেষত কার্যকর যদি আপনার কেবল অভিন্ন থ্রেডগুলির একগুচ্ছ প্রয়োজন হয়, যাতে ওভারহেড তৈরি না করে আপনার কাজ করতে প্রস্তুত।


1

আপনার যদি প্রচুর থ্রেডের প্রয়োজন হয় তবে আপনি সম্ভবত একটি থ্রেডপুল ব্যবহার করতে চান। তারা থ্রেড তৈরির ওভারহেড সংরক্ষণ করে থ্রেডগুলি পুনরায় ব্যবহার করে।

কিছু করতে যদি আপনার কেবল একটি থ্রেড প্রয়োজন হয় তবে থ্রেড সম্ভবত সবচেয়ে সহজ।


1

থাডপুলের থ্রেডগুলির প্রাথমিক প্রয়োজন হ'ল সংক্ষিপ্ত সামান্য কাজগুলি হ্যান্ডেল করা যা প্রায় তাত্ক্ষণিকভাবে সম্পন্ন হবে বলে মনে করা হয়। হার্ডওয়্যার বিঘ্নিত হ্যান্ডলারগুলি প্রায়শই স্ট্যাকিং প্রসঙ্গে চালিত হয় যা নন-কার্নেল কোডের জন্য উপযুক্ত নয়, তবে একটি হার্ডওয়্যার বিঘ্নিত হ্যান্ডলার আবিষ্কার করতে পারে যে ব্যবহারকারী-মোড I / O সমাপ্তি কলব্যাকটি যত তাড়াতাড়ি সম্ভব চালানো উচিত। এ জাতীয় জিনিস চালানোর উদ্দেশ্যে একটি নতুন থ্রেড তৈরি করা বড় পরিমাণে ব্যয় হবে। কয়েকটি প্রাক-তৈরি থ্রেড থাকা যা I / O সমাপ্তি কলব্যাকগুলি বা অন্যান্য অনুরূপ জিনিসগুলি চালানোর জন্য প্রেরণ করা যায় তা আরও কার্যকর।

এই ধরনের থ্রেডগুলির একটি মূল বিষয় হ'ল যদি আমি / হে সমাপ্তির পদ্ধতিগুলি সর্বদা তাত্ক্ষণিকভাবে সম্পূর্ণ হয় এবং কখনও অবরুদ্ধ হয় না এবং বর্তমানে এই ধরনের পদ্ধতিগুলি চালিত এমন থ্রেডগুলির সংখ্যা কমপক্ষে প্রসেসরের সংখ্যার সমান, অন্য কোনও থ্রেডের একমাত্র উপায় উপরে উল্লিখিত পদ্ধতিগুলির একটি শেষ হওয়ার আগে দৌড়াতে পারে যদি অন্য কোনও পদ্ধতির মধ্যে একটি অবরুদ্ধ হয় বা এর সম্পাদনের সময়টি একটি স্বাভাবিক থ্রেডিং টাইম-স্লাইস ছাড়িয়ে যায়; থ্রেড পুলটি যদি উদ্দেশ্য হিসাবে ব্যবহার করা হয় তবে এগুলির মধ্যে কোনও একটিই খুব ঘন ঘন হওয়া উচিত নয়।

যদি কোনও পদ্ধতি 100 মিমি বা তার বাইরে চলে যাওয়ার আশা করা যায় না যখন এটি সম্পাদন শুরু হয়, মূল থ্রেড পুল ব্যতীত অন্য কোনও উপায়ে পদ্ধতিটি কার্যকর করা উচিত। যদি কোনও সিপিইউ নিবিড় যা সম্পাদন করতে অনেক কাজ করে থাকে তবে তা অবরুদ্ধ হয় না, অ্যাপ্লিকেশন থ্রেডগুলির একটি পুল (সিপিইউ কোর প্রতি এক) ব্যবহার করে এটি প্রেরণে সহায়ক হতে পারে যা "মূল" থ্রেডপুল থেকে পৃথক নন-ব্লকিং সিপিইউ-নিবিড় কাজগুলি চালানোর সময় কোরের চেয়ে বেশি থ্রেডগুলি প্রতিরোধী হবে। তবে, যদি কোনও পদ্ধতি কার্যকর করতে দ্বিতীয় বা তার বেশি সময় নেয় এবং তার বেশিরভাগ সময় অবরুদ্ধভাবে ব্যয় করে তবে পদ্ধতিটি সম্ভবত ডেডিকেটেড থ্রেডে চালিত হওয়া উচিত এবং প্রায় অবশ্যই একটি মূল-থ্রেডপুলের থ্রেডে চালানো উচিত নয়। যদি একটি দীর্ঘ-চলমান অপারেশনকে আই / ও কলব্যাকের মতো কিছু দ্বারা ট্রিগার করা দরকার হয়,


0

সাধারণভাবে (আমি কখনই .NET ব্যবহার করি নি), একটি থ্রেড পুল সম্পদ পরিচালনার কাজে ব্যবহার করা হবে। এটি আপনার সফ্টওয়্যারটিতে বাধা কনফিগার করার অনুমতি দেয়। এটি কার্য সম্পাদনের কারণেও করা হতে পারে, কারণ নতুন থ্রেড তৈরি করা ব্যয়বহুল হতে পারে।

সিস্টেমের নির্দিষ্ট কারণও থাকতে পারে। জাভাতে (আবার আমি জানি না এটি NET- র ক্ষেত্রে প্রযোজ্য কিনা), থ্রেডগুলির পরিচালক ম্যানেজার থ্রেড নির্দিষ্ট ভেরিয়েবলগুলি প্রয়োগ করতে পারে কারণ পুল থেকে প্রতিটি থ্রেড টানা থাকে এবং সেগুলি ফিরে আসার পরে আনসেট করা হয় (যেমন কিছু পাস করার সাধারণ উপায়) একটি পরিচয়)।

উদাহরণসীমাবদ্ধতা: আমার কাছে কেবল 10 ডিবি সংযোগ রয়েছে, সুতরাং আমি কেবলমাত্র 10 কর্মী থ্রেডকে ডেটাবেস অ্যাক্সেসের জন্য অনুমতি দেব।

এর অর্থ এই নয় যে আপনার নিজের থ্রেডগুলি তৈরি করা উচিত নয়, তবে এমন কিছু শর্ত রয়েছে যার অধীনে এটি পুল ব্যবহার করা বোধ করে।


0

পুলটি ব্যবহার করা ভাল ধারণা, যদি আপনি না জানেন বা কয়টি থ্রেড তৈরি করা হবে তা নিয়ন্ত্রণ করতে না পারেন।

একটি তালিকা নিয়ন্ত্রণের পজিশনযুক্ত ইভেন্টের একটি ডেটাবেস থেকে কিছু ক্ষেত্র আপডেট করার জন্য থ্রেড ব্যবহার করে একটি ফর্মের সাথে কেবল একটি সমস্যা রয়েছে (ফ্রিজ এড়ানো)। আমার ব্যবহারকারীর ডাটাবেস থেকে ত্রুটি থাকতে 5 মিনিট সময় লেগেছে (অ্যাক্সেসের সাথে অনেক বেশি সংযোগ) কারণ তিনি খুব দ্রুত তালিকার অবস্থান পরিবর্তন করছেন ...

আমি জানি বেস সমস্যাটি সমাধানের অন্যান্য উপায় আছে (অ্যাক্সেস ব্যবহার না করে সহ) তবে পুলিং একটি ভাল শুরু।


0

সুতা :

  1. থ্রেড-পুল ব্যবহার করার চেয়ে একটি থ্রেড তৈরি করা অনেক ধীর।
  2. আপনি কোনও থ্রেডের অগ্রাধিকার পরিবর্তন করতে পারেন।
  3. সংস্থানসমূহ সম্পর্কিত কোনও প্রক্রিয়াতে সর্বাধিক সংখ্যক থ্রেড।
  4. থ্রেডটি ওএস স্তরে এবং ওএস দ্বারা নিয়ন্ত্রিত হয়।
  5. কাজটি তুলনামূলকভাবে দীর্ঘমেয়াদী চলাকালীন থ্রেড ব্যবহার করা একটি ভাল বিকল্প

থ্রেড-পুল :

  1. থ্রেড-পুলের উপর একটি থ্রেড চালানো সরাসরি একটি থ্রেড তৈরির চেয়ে অনেক দ্রুত।
  2. থ্রেড-পুলের উপর ভিত্তি করে আপনি থ্রেড রানের অগ্রাধিকার পরিবর্তন করতে পারবেন না।
  3. প্রতি প্রক্রিয়াটিতে একটি মাত্র থ্রেড-পুল রয়েছে।
  4. থ্রেড-পুলটি সিএলআর দ্বারা পরিচালিত হয়।
  5. থ্রেড-পুলটি স্বল্প-কালীন অপারেশনের জন্য দরকারী useful
  6. থ্রেড-পুলের থ্রেডগুলির সংখ্যা অ্যাপ্লিকেশন লোডের সাথে সম্পর্কিত।
  7. টিপিএল টাস্কগুলি থ্রেড-পুলের ভিত্তিতে পরিচালিত হয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.