সি # তে থ্রেড পুল কখন ব্যবহার করবেন? [বন্ধ]


127

আমি সি # তে মাল্টি-থ্রেড প্রোগ্রামিং শিখার চেষ্টা করেছি এবং থ্রেড পুল বনাম নিজের থ্রেড তৈরি করা কখন ভাল best সে সম্পর্কে আমি বিভ্রান্ত হয়ে পড়েছি। একটি বই কেবলমাত্র ছোট কাজের জন্য একটি থ্রেড পুল ব্যবহার করার পরামর্শ দেয় (যার অর্থ যাই হোক না কেন) তবে আমি কোনও বাস্তব নির্দেশিকা খুঁজে পেতে পারি না বলে মনে হয়। এই প্রোগ্রামিং সিদ্ধান্ত নেওয়ার সময় আপনি কিছু বিবেচনা কি ব্যবহার করবেন?

উত্তর:


47

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

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

সম্পাদনা: কিছু বিবেচনার বিষয়ে, আমি ডাটাবেস অ্যাক্সেস, পদার্থবিজ্ঞান / সিমুলেশন, এআই (গেমস) এর জন্য থ্রেড পুল ব্যবহার করি এবং স্ক্রিপ্টযুক্ত কাজগুলি ভার্চুয়াল মেশিনে চলে যেগুলি প্রচুর ব্যবহারকারীর সংজ্ঞায়িত কার্য প্রক্রিয়া করে।

সাধারণত একটি পুলটিতে প্রসেসর প্রতি 2 টি থ্রেড থাকে (তাই সম্ভবত আজকাল 4 টি) তবে আপনি কতগুলি থ্রেড প্রয়োজন তা আপনি সেট করতে পারেন।

সম্পাদনা করুন: আপনার নিজের থ্রেডগুলি তৈরি করার কারণ প্রসঙ্গ পরিবর্তনের কারণে, (যখন থ্রেডগুলি তাদের স্মৃতিশক্তি সহ প্রক্রিয়াটির অভ্যন্তরীণ অভ্যন্তরীণ পরিবর্তন এবং আউট দরকার হয়)। অকেজো প্রসঙ্গ পরিবর্তনের পরে, যখন আপনি নিজের থ্রেডগুলি ব্যবহার করছেন না তখন বলুন যে কেউ আপনার কথায় বলতে পারেন, সহজেই আপনার প্রোগ্রামের অর্ধেক পারফরম্যান্স করতে পারেন (বলুন যে আপনার কাছে 3 টি স্লিপিং থ্রেড এবং 2 টি সক্রিয় থ্রেড রয়েছে)। সুতরাং যদি থ্রেডগুলি ডাউনলোড করার জন্য অপেক্ষা করা হয় তবে তারা আপনার প্রচুর অ্যাপ্লিকেশনটির জন্য প্রচুর সিপিইউ খাচ্ছে এবং ক্যাশে শীতল করছে cool


2
ঠিক আছে, তবে আপনি কেন ব্যাখ্যা করতে পারবেন যে কেন আপনি এটির কাছে এসেছেন? উদাহরণস্বরূপ, রিমোট সার্ভারগুলি থেকে ডাউনলোড করার জন্য থ্রেড পুলটি ব্যবহার করার বা ডিস্ক আইওয়ের খারাপ দিকটি কী?

8
যদি থ্রেডটি একটি সিঙ্ক্রোনাইজেশন অবজেক্টের (ইভেন্ট, সেম্যাফোর, মিটেক্স, ইত্যাদি) অপেক্ষা করে থাকে তবে থ্রেডটি সিপিইউ গ্রহণ করে না।
ব্র্যানন

7
ব্র্যানন যেমন বলেছিলেন, একটি প্রচলিত রূপকথাটি হ'ল একাধিক থ্রেড তৈরির ফলে কর্মক্ষমতা প্রভাবিত হয়। আসলে, অব্যবহৃত থ্রেডগুলি খুব অল্প সংস্থান গ্রহণ করে। প্রসঙ্গের স্যুইচগুলি কেবলমাত্র খুব উচ্চ ডিমান্ড সার্ভারগুলিতেই সমস্যা হতে শুরু করে (এই ক্ষেত্রে, বিকল্পের জন্য I / O সমাপ্তি বন্দরগুলি দেখুন)।
এফডিসিস্টেল

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

2
নিষ্ক্রিয় পরিচালিত থ্রেডগুলি তাদের স্ট্যাকের জন্য মেমরি খায়। ডিফল্টরূপে প্রতি থ্রেডে 1 এমআইবি হয়। সুতরাং সব থ্রেডে কাজ করা ভাল।
ভাদিয়াম স্টেসিয়াক

48

আমি আপনাকে অন্য কোনও ভাষার মতো একই কারণে সি # তে একটি থ্রেড পুল ব্যবহার করার পরামর্শ দিচ্ছি।

আপনি যখন চলমান থ্রেডের সংখ্যা সীমাবদ্ধ করতে চান বা তাদের তৈরি এবং ধ্বংসের ওভারহেড চান না, তখন একটি থ্রেড পুল ব্যবহার করুন।

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

অন্যথায় আপনি থ্রেড তৈরি এবং ধ্বংস করার জন্য আপনার বেশিরভাগ সময় ব্যয় করেছেন কেবল তারা যে কাজটি করার তাগিদ করছেন doing


28

। নেট: http://blogs.msdn.com/pedram/archive/2007/08/05/dedmitted-thread-or-a-threadpool-thread.aspx এ থ্রেড পুলের একটি দুর্দান্ত সংক্ষিপ্তসার এখানে's

থ্রেড পুলটি কখন ব্যবহার করা উচিত নয় এবং পরিবর্তে আপনার নিজের থ্রেডটি শুরু করা উচিত নয় সে বিষয়েও পোস্টটিতে কিছু পয়েন্ট রয়েছে।


8
লিঙ্কের জন্য -1। আমি নিশ্চিত এটি একটি ভাল লিঙ্ক, তবে আমি আশা করি এটি স্বয়ংসম্পূর্ণ হবে।
জন ডেভিস

26
@ stimpy77 - এটি তখন ভুল প্রত্যাশা। এসও কখনই স্বাবলম্বী হতে পারে না, কারণ এটি সমস্ত প্রশ্নের উপরই চূড়ান্ত কর্তৃত্ব নয়, না প্রতিটি বিষয়ে সমস্ত গভীর তথ্য এই বিষয়টিকে স্পর্শ করে এমন প্রতিটি এসও উত্তরে নকল করতে পারে। (এবং আমি মনে করি না যে আপনার কাছে জন স্কিটির একক উত্তর যে আউটবাউন্ড লিঙ্ক রয়েছে তার চেয়ে কম মূল্য দিতে আপনার যথেষ্ট সুনাম আছে, বিদেশী লিঙ্কগুলি রয়েছে এমন সমস্ত SO ব্যবহারকারীদের সমস্ত উত্তর একাই ছেড়ে দিন:)
ফ্রান্সি পেনভ

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

8
"আপনি পোস্ট হওয়ার দুই বছর পরে আপনি এই পোস্টে এসেছিলেন এবং আমি এখানে যে অনুলিপি করেছিলাম তা এখনই অচল হয়ে গেছে।" সুতরাং একটি লিঙ্ক হতে পারে। একটি লিঙ্ক পোস্ট করার সময় একটি সংক্ষিপ্ত কিন্তু সম্পূর্ণ সারাংশ পোস্ট করুন, আপনি কখনই জানেন না যে কোনও লিঙ্কটি বাসি বা মরে গেছে কিনা dead
জন ডেভিস

2
আমি স্ট্যাম্পির সাথে একমত নই: অপ্রয়োজনীয়তার কারণে প্রচুর টন তথ্য সম্বলিত পোস্টগুলির ধারণা নয়, বা এ সম্পর্কে কাউকে কল করাও নয়। আমি এটা বলতে চাই আরো , সম্ভবত একটি লিঙ্ক বিষয়বস্তু চেয়ে অস্ত্রোপচারের উপযোগী নয় এমন হয়ে যদিও অননুমোদিত / obviated হয়ে যায়। সুতরাং, যখন অনুষ্ঠানটি অনুমতি দেয় তখন আরও বেশি সামগ্রী ভাল। আমরা সবাই (বেশিরভাগ) স্বেচ্ছাসেবক, তাই আপনি যা পান তার জন্য কৃতজ্ঞ - ধন্যবাদ
ফ্রেঞ্চি

14

আমি এই নিখরচায় ই- বুকটি পড়ার জন্য সুপারিশ করছি: জোসেফ আলবাহারির সি # থ্রেডিং ইন সি #

কমপক্ষে "শুরু করা" বিভাগটি পড়ুন। ই-বুক একটি দুর্দান্ত ভূমিকা প্রদান করে এবং পাশাপাশি উন্নত থ্রেডিংয়ের তথ্যের সংস্থানও দেয়।

থ্রেড পুলটি ব্যবহার করবেন কিনা তা জানা মাত্র শুরু। এর পরে আপনার থ্রেড পুলে প্রবেশের কোন পদ্ধতিটি আপনার প্রয়োজনের পক্ষে সবচেয়ে বেশি উপযুক্ত তা নির্ধারণ করতে হবে:

  • কার্য সমান্তরাল গ্রন্থাগার (। নেট ফ্রেমওয়ার্ক 4.0)
  • ThreadPool.QueueUserWorkItem
  • অ্যাসিঙ্ক্রোনাস প্রতিনিধি
  • BackgroundWorker

এই ই-বুকটি এই সমস্ত ব্যাখ্যা করে এবং কখন এটি বনাম বনাম আপনার নিজস্ব থ্রেড তৈরি করতে হবে তা পরামর্শ দেয়।


8

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

এখন, যদি সেই প্রতিটি উপাদান থ্রেড পুলে আইটেম সারি করছিল তবে আপনার ওভারহেডে স্যুইচিং অনেক কম প্রসঙ্গ হতে পারে।

থ্রেড পুলটি আপনার সিপিইউগুলি (বা সিপিইউ কোর) জুড়ে কাজ সর্বাধিক করার জন্য ডিজাইন করা হয়েছে। এই কারণেই, ডিফল্টরূপে, থ্রেড পুলটি প্রসেসরের প্রতি একাধিক থ্রেড আপ করে।

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

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

দ্রষ্টব্য: আপনি ডেটা ডাউনলোড করতে বা ডিস্ক I / O সম্পাদন করতে থ্রেড পুলের থ্রেড ব্যবহার করার বিষয়ে জিজ্ঞাসা করেছিলেন। এর জন্য আপনার কোনও থ্রেড পুল থ্রেড ব্যবহার করা উচিত নয় (যে কারণে আমি উপরে বর্ণিত)। পরিবর্তে অ্যাসিঙ্ক্রোনাস আই / ও (ওরফে দ্য বিগেনএক্সএক্স এবং এন্ডএক্সএক্স পদ্ধতি) ব্যবহার করুন। এটির জন্য এবং FileStreamতা হবে । এটির জন্য এবং তা হবে । এগুলি ব্যবহারে আরও জটিল, তবে এগুলি মাল্টি-থ্রেডযুক্ত I / O সঞ্চয়ের সঠিক উপায়।BeginReadEndReadHttpWebRequestBeginGetResponseEndGetResponse


1
থ্রেডপুল একটি চতুর স্বয়ংক্রিয়। "যদি এর সারিটি আধা সেকেন্ডেরও বেশি স্থিতিশীল থাকে, তবে এটি থ্রেড পুলের সক্ষমতা পর্যন্ত প্রতি আধা সেকেন্ডে আরও একটি থ্রেড তৈরি করে প্রতিক্রিয়া জানায়" ( albahari.com/threading/#_Optimizing_t_Thread_Pool )। এছাড়াও থ্রেডপুলের মাধ্যমে বিগনিএক্সএক্সএক্সএক্সএন্ডএক্সএক্সএক্সএক্সের সাথে প্রায় অ্যাসিঙ্ক্রোনাস অপারেশনগুলি ব্যবহৃত হয়। সুতরাং ডেটা ডাউনলোড করতে থ্রেডপুল ব্যবহার করা স্বাভাবিক এবং প্রায়শই স্পষ্টভাবে ব্যবহৃত হয়।
আর্ট্রু

6

থ্রেড অনাহার প্রবণ হওয়ায় তাদের প্রক্রিয়াকরণের কোনও উল্লেখযোগ্য, পরিবর্তনশীল বা অজানা অংশের জন্য ব্লক হতে পারে এমন ক্রিয়াকলাপগুলির জন্য .NET থ্রেড পুল থেকে সাবধান থাকুন। .NET সমান্তরাল এক্সটেনশানগুলি ব্যবহার করে বিবেচনা করুন, যা থ্রেডেড ক্রিয়াকলাপগুলির তুলনায় বেশ কয়েকটি লজিকাল বিমূর্ততা সরবরাহ করে। এগুলিতে একটি নতুন শিডিয়ুলারও অন্তর্ভুক্ত রয়েছে, যা থ্রেডপুলের উন্নতি হওয়া উচিত। এখানে দেখুন


2
আমরা এটি হার্ড উপায় আবিষ্কার! এএসপি.নেট ব্যবহার করে থ্রেডপুলটি উপস্থিত হয় এবং তাই আমরা এটির মতো আক্রমণাত্মক ব্যবহার করতে পারি না।
noocyte

3

থ্রেড পুলটি কেবলমাত্র ছোট কাজের জন্য ব্যবহার করার একটি কারণ হ'ল সীমিত সংখ্যক থ্রেড পুল থ্রেড রয়েছে। যদি একটি দীর্ঘ সময়ের জন্য ব্যবহার করা হয় তবে এটি অন্য কোড দ্বারা থ্রেডটি থামানো বন্ধ করে দেয়। যদি এটি বেশ কয়েকবার ঘটে থাকে তবে থ্রেড পুলটি ব্যবহৃত হতে পারে।

থ্রেড পুলটি ব্যবহার করাতে সূক্ষ্ম প্রভাব থাকতে পারে - কিছু .NET টাইমার থ্রেড পুলের থ্রেড ব্যবহার করে এবং আগুন দেয় না, উদাহরণস্বরূপ।


2

আপনার যদি ব্যাকগ্রাউন্ড টাস্ক থাকে যা আপনার প্রয়োগের পুরো জীবনকালের মতো দীর্ঘ সময়ের জন্য বেঁচে থাকে তবে নিজের থ্রেড তৈরি করা যুক্তিসঙ্গত জিনিস। যদি আপনার ছোট কাজ থাকে যা থ্রেডে করা দরকার, তবে থ্রেড পুলিং ব্যবহার করুন।

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

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


আপনি যদি "থ্রেড পুল" বা "থ্রেড পুল" বলতে চান তবে দয়া করে স্পষ্ট করুন। এগুলি খুব আলাদা জিনিস (কমপক্ষে এমএস সিএলআরতে)।
bzlm

2

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

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

যা আলোচনা করা উচিত তা হ'ল উইন্ডোজের মূল নির্বাহ ইউনিট (উইন্ডোজ 10 সহ) একটি থ্রেড, এবং ওএসের প্রসঙ্গে সুইচিং ওভারহেড সাধারণত নগণ্য igible সহজ কথায় বলতে গেলে, এই নিবন্ধটি প্রাসঙ্গিক স্যুইচিং বা আরও ভাল সিপিইউ ব্যবহারের সংরক্ষণ করে নিবন্ধটি উচ্চতর পারফরম্যান্সের দাবি করে কিনা সেগুলির অনেকের দৃinc়প্রত্যয়ী প্রমাণ আমি খুঁজে পাচ্ছি না।

এখন কিছুটা বাস্তবতার জন্য:

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

সুতরাং সবচেয়ে গুরুত্বপূর্ণ হতে পারে যেটি আলোচনা করা হ'ল প্রোগ্রামটি সহজ।

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

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

সংক্ষেপে, টাস্ক বনাম থ্রেড বনাম।। নেট থ্রেডপুলের উপকারিতা এবং কৌশলগুলি বোঝা গুরুত্বপূর্ণ important আমার যদি উচ্চতর পারফরম্যান্সের প্রয়োজন হয় তবে আমি থ্রেড ব্যবহার করতে যাচ্ছি এবং আমি আমার নিজের পুল ব্যবহার করতে পছন্দ করি।

তুলনা করার একটি সহজ উপায় 512 থ্রেড, 512 কার্য এবং 512 থ্রেডপুলের থ্রেড শুরু করা। আপনি থ্রেডস দিয়ে শুরুতে বিলম্ব দেখতে পাবেন (অতএব, থ্রেড পুল কেন লিখুন) তবে সমস্ত 512 থ্রেড কয়েক সেকেন্ডের মধ্যে চলতে থাকবে যখন টাস্ক এবং .NET থ্রেডপুলের থ্রেডগুলি শুরু হতে কয়েক মিনিট সময় নেয়।

নীচে এমন পরীক্ষার ফলাফল দেওয়া হয়েছে (১ 16 গিগাবাইট র‌্যাম সহ আই 5 কোয়াড কোর), প্রতি 30 সেকেন্ড চালানোর জন্য দেয়। কার্যকর করা কোডটি একটি এসএসডি ড্রাইভে সহজ ফাইল I / O সম্পাদন করে।

পরীক্ষার ফলাফল


1
এফওয়াইআই, এটি উল্লেখ করতে ভুলে গিয়েছিলেন যে টাস্ক এবং .NET থ্রেডগুলি NET এর মধ্যে সম্মতিযুক্ত এবং ম্যানেজমেন্টের সাথে নির্বাহ করা হয় N ওএস নয় - আধুনিক যুগ্ম মৃত্যুদন্ড পরিচালনার ক্ষেত্রে আরও কার্যকর being আমি অনেক কিছুর জন্য টাস্ক ব্যবহার করি তবে ভারী মৃত্যুদন্ড কার্যকর করার জন্য আমি একটি ওএস থ্রেড ব্যবহার করি। এমএস দাবি করে যে টাস্ক এবং .NET থ্রেডগুলি আরও ভাল, তবে তারা। নেট অ্যাপ্লিকেশনগুলির মধ্যে একত্রে সামঞ্জস্য রাখতে সাধারণত। কোনও সার্ভার অ্যাপ্লিকেশন ওএস হ্যান্ডেলকে একযোগে দেওয়া সর্বোত্তমভাবে সম্পাদন করবে।

আপনার কাস্টম থ্রেডপুলের বাস্তবায়ন দেখতে পছন্দ করবে। ভালো লাগলো!
ফ্রান্সিস

আমি আপনার পরীক্ষার ফলাফল বুঝতে পারি না। দাস "ইউনিট রন" এর অর্থ কী? আপনি 512 থ্রেডের সাথে 34 টাকা তুলনা করছেন? আপনি দয়া করে এটি ব্যাখ্যা করবেন?
এলমু

ইউনিট হ'ল এক টাস্ক, থ্রেড, বা। নেট থ্রেডপুল কর্মী থ্রেডে একযোগে সঞ্চালনের জন্য একটি পদ্ধতি, আমার পরীক্ষাটি স্টার্টআপ / রান পারফরম্যান্সের সাথে তুলনা করে। প্রতিটি পরীক্ষায় স্ক্র্যাচ থেকে 512 থ্রেড, 512 টাস্ক, 512 থ্রেডপুল কর্মী থ্রেড, অথবা 512 এর পুলটি পুনরায় শুরু করার জন্য থ্রেডগুলি কার্যকর করার প্রসঙ্গে অপেক্ষা করা থ্রেড থাকে। টাস্কস এবং থ্রেডপুল কর্মী থ্রেডগুলির ধীরে ধীরে স্পিন থাকে তাই 30 সেকেন্ডের এগুলি সমস্ত স্পিন করার পক্ষে যথেষ্ট সময় নেই। তবে, থ্রেডপুল মিনিটের কর্মী থ্রেডের গণনাটি প্রথমে 512 এ সেট করা থাকলে, উভয় টাস্ক এবং থ্রেডপুল কর্মী থ্রেড স্ক্র্যাচ থেকে প্রায় 512 থ্রেড হিসাবে দ্রুত গতিতে চলে যাবে।


1

থ্রেড পুলগুলি দুর্দান্ত থাকে যখন আপনার কাছে উপলব্ধ থ্রেডের চেয়ে প্রক্রিয়া করার জন্য আরও কাজ থাকে।

আপনি একটি থ্রেড পুলে সমস্ত কাজ যুক্ত করতে পারেন এবং নির্দিষ্ট সময়ে চলতে পারে এমন সর্বাধিক সংখ্যক থ্রেড নির্দিষ্ট করতে পারেন।

এমএসডিএন-তে এই পৃষ্ঠাটি দেখুন : http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80).aspx


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

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

1

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


1

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

তবে কিছু পরিস্থিতিতে আপনি একটি থ্রেড তৈরি করতে চাইতে পারেন। উদাহরণস্বরূপ, যদি আপনি কেবল থ্রেড পুল ব্যবহার করেন না এবং আপনার তৈরি করা থ্রেড দীর্ঘকালীন (ভাগ করা সংস্থান গ্রহণ করা এড়াতে) বা উদাহরণস্বরূপ যদি আপনি থ্রেডের স্ট্যাকসাইজ নিয়ন্ত্রণ করতে চান।


1

পটভূমি কর্মী তদন্ত করতে ভুলবেন না।

আমি অনেক পরিস্থিতি সন্ধান করি, এটি ভারী উত্তোলন ছাড়াই আমাকে যা চান তা দেয়।

চিয়ার্স।


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

0

আমি যখনই কেবল অন্য থ্রেডে কিছু করার দরকার হয় তখন আমি সাধারণত থ্রেডপুল ব্যবহার করি এবং এটি কখন চালায় বা শেষ হয় তা যত্ন করে দেখায় না। লগিং বা পটভূমি এমনকি কোনও ফাইল ডাউনলোড করার মতো কিছু (যদিও এই অ্যাসিঙ্ক-স্টাইলটি করার আরও ভাল উপায় রয়েছে)। যখন আমার আরও নিয়ন্ত্রণের প্রয়োজন হয় তখন আমি আমার নিজস্ব থ্রেড ব্যবহার করি। এছাড়াও আমি যা পেয়েছি তা হ'ল "কমান্ড অবজেক্টস" সংরক্ষণ করার জন্য থ্রেডসফাই ক্যু (আপনার নিজের হ্যাক করুন) খুব ভাল যখন আমার একাধিক কমান্ড থাকে তবে আমার> 1 থ্রেডে কাজ করা দরকার। সুতরাং আপনি একটি এক্সএমএল ফাইল বিভক্ত করতে পারবেন এবং প্রতিটি উপাদানকে একটি সারিতে রেখে দিতে পারেন এবং তারপরে এই উপাদানগুলির উপর কিছু প্রক্রিয়াজাতকরণের জন্য একাধিক থ্রেড কাজ করতে পারেন। আমি ইউনিতে (VB.net!) এমন একটি সারি লিখেছি যা আমি সি # তে রূপান্তর করেছি। আমি কোনও নির্দিষ্ট কারণে এটি নীচে অন্তর্ভুক্ত করেছি (এই কোডটিতে কিছু ত্রুটি থাকতে পারে)।

using System.Collections.Generic;
using System.Threading;

namespace ThreadSafeQueue {
    public class ThreadSafeQueue<T> {
        private Queue<T> _queue;

        public ThreadSafeQueue() {
            _queue = new Queue<T>();
        }

        public void EnqueueSafe(T item) {
            lock ( this ) {
                _queue.Enqueue(item);
                if ( _queue.Count >= 1 )
                    Monitor.Pulse(this);
            }
        }

        public T DequeueSafe() {
            lock ( this ) {
                while ( _queue.Count <= 0 )
                    Monitor.Wait(this);

                return this.DeEnqueueUnblock();

            }
        }

        private T DeEnqueueUnblock() {
            return _queue.Dequeue();
        }
    }
}

এই পদ্ধতির সাথে কিছু সমস্যা: - ডেকিউস্যাফের কল () কোনও আইটেম EnqueuedSafe () না হওয়া পর্যন্ত অপেক্ষা করবে। মনিটরগুলির মধ্যে একটি ব্যবহার বিবেচনা করুন a টাইমআউট নির্দিষ্ট করে ওয়েট () ওভারলোডগুলি। - এটিকে লক করা সর্বোত্তম অনুশীলন অনুসারে নয়, কেবল একটি পঠনযোগ্য বস্তুর ক্ষেত্র তৈরি করুন। - যদিও মনিটর.পুলস () হালকা ওজনের, যখন সারিটিতে কেবল 1 টি আইটেম থাকে তখন এটিকে কল করা আরও কার্যকর হবে। - DeEnqueueUnblock () preferrably queue.Count> 0. (প্রয়োজন Monitor.PulseAll বা অপেক্ষার সময় সমাপ্ত ব্যবহার করা হয় যদি থাকে) পরীক্ষা করা উচিত
ক্রেগ নিকলসনের

0

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

মূল প্রশ্নের হিসাবে, থ্রেড পুলটি পুনরাবৃত্তিমূলক গণনাগুলি অংশগুলিতে ভাঙ্গার জন্য দরকারী যা সমান্তরালভাবে নির্বাহ করা যেতে পারে (ধরে নিলে তারা সমান্তরালে কার্যকর হতে পারে ফলাফলটি পরিবর্তন না করে) exec ম্যানুয়াল থ্রেড পরিচালনা UI এবং IO এর মতো কাজের জন্য দরকারী।

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