ফিক্সডথ্রেডপুল বনাম ক্যাশেডথ্রেডপুল: দুটি খারাপের কম


97

আমার কাছে এমন একটি প্রোগ্রাম রয়েছে যা থ্রেডগুলি তৈরি করে (5-150 ডলার) যা অনেকগুলি কাজ সম্পাদন করে। মূলত, আমি একটি ব্যবহার করেছি FixedThreadPoolকারণ এই অনুরূপ প্রশ্নে পরামর্শ দেওয়া হয়েছিল যে তারা দীর্ঘকালীন কাজের জন্য আরও উপযুক্ত ছিল এবং আমার বহুলিপি পাঠের সীমিত জ্ঞানের সাথে আমি থ্রেডগুলির গড় জীবনকে (বেশ কয়েক মিনিট) " দীর্ঘজীবী " বলে বিবেচনা করেছি।

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

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

উত্তর:


112

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

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

public static ExecutorService newFixedThreadPool(int nThreads) {
     return new ThreadPoolExecutor(nThreads, nThreads,
                                   0L, TimeUnit.MILLISECONDS,
                                   new LinkedBlockingQueue<Runnable>());
 }

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                 60L, TimeUnit.SECONDS,
                                 new SynchronousQueue<Runnable>());
}

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

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


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

4
কেন কেবল একটি সীমাবদ্ধ ThreadPoolExecutorপছন্দ তৈরি করবেন না ThreadPoolExecutor(0, maximumPoolSize, 60L, TimeUnit.SECONDS, SynchronousQueue())?
অভিজিৎ সরকার

47

উভয়ই FixedThreadPoolএবং CachedThreadPoolঅত্যন্ত লোড অ্যাপ্লিকেশনগুলিতে দুষ্টতা।

CachedThreadPool এর চেয়ে বেশি বিপজ্জনক FixedThreadPool

যদি আপনার অ্যাপ্লিকেশনটি খুব বেশি লোড হয় এবং কম বিলম্বের দাবি করে তবে নীচের ত্রুটিগুলির কারণে উভয় বিকল্প থেকে মুক্তি পাওয়া ভাল get

  1. টাস্কের সারিটির সীমাহীন প্রকৃতি: এটি মেমরি বা উচ্চ বিলম্বের কারণ হতে পারে
  2. দীর্ঘ চলমান থ্রেড CachedThreadPoolথ্রেড তৈরিতে নিয়ন্ত্রণের বাইরে চলে যাবে cause

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

  1. আরও ভাল নিয়ন্ত্রণের জন্য সীমাবদ্ধ সারি হিসাবে কার্য সারিটি সেট করুন
  2. ডান প্রত্যাখ্যানহ্যান্ডলার রয়েছে - আপনার নিজস্ব প্রত্যাখ্যানহ্যান্ডলার বা জেডিকে সরবরাহ করেছেন ডিফল্ট হ্যান্ডলারগুলি
  3. যদি আপনার কাজ শেষ হওয়ার আগে / পরে কিছু করার থাকে তবে ওভাররাইড beforeExecute(Thread, Runnable)এবংafterExecute(Runnable, Throwable)
  4. থ্রেডফ্যাক্টরি ওভাররাইড করুন , যদি থ্রেড কাস্টমাইজেশন প্রয়োজন হয়
  5. চলাকালীন সময়ে থ্রেড পুলের আকারটি গতিশীলভাবে নিয়ন্ত্রণ করুন (সম্পর্কিত এসই প্রশ্ন: ডায়নামিক থ্রেড পুল )

কেউ যদি কমনপুল ব্যবহারের সিদ্ধান্ত নেয়?
ক্রস্ক কুল

4
@ রবীন্দ্র - আপনি ক্যাচড্র্যাডপুল এবং ফিক্সডথ্রেডপুল উভয়ই সম্পর্কে সুন্দরভাবে ব্যাখ্যা করেছেন। এটি দেখায় যে আপনি একযোগে প্যাকেজটির গভীর উপলব্ধি পেয়েছেন।
আয়াসকান্ত

5

সুতরাং আমার কাছে এমন একটি প্রোগ্রাম রয়েছে যা থ্রেডগুলিকে তৈরি করে (5-150 ডলার) যা অনেকগুলি কাজ সম্পাদন করে।

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

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

এবং এই সমস্যাটি ফিক্সডথ্রেডপুলের সাথে দেখা যায় না, উদাহরণস্বরূপ 2 + n থ্রেড দিয়ে তৈরি করা হয়েছে, যেখানে এন অবশ্যই যুক্তিসঙ্গত কম, কারণ সেই হার্ডওয়্যার এবং ওএস সংস্থানগুলি থ্রেডগুলি পরিচালনা করার জন্য অনেক কম ওভারহেড সহ ব্যবহৃত হয় যা কোনওভাবেই চলতে পারে না।


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

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

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

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

4
@ থারস্টেনশানিং, 2-কোর মেশিনে 50 টি সিপিইউ-বাউন্ড থ্রেড থাকা অসহনীয়। 2-কোর মেশিনে 50 টি আইও-বদ্ধ থ্রেড থাকা খুব সহায়ক হতে পারে।
পল ড্রাগন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.