নতুন কোন নির্মাণের পরিবর্তে কোনও সরল পুরাতন থ্রেড অবজেক্ট ব্যবহার করা পছন্দনীয় কি এমন কোনও মামলা রয়েছে?


112

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

এছাড়াও, অন্যান্য বিশেষীকরণ পদ্ধতিগুলি আরও Threadকম আবেদনকারী শ্রেণীর প্রতিদান দিচ্ছে , যেমন Timerকুৎসিত Thread+ Sleepকম্বো প্রতিস্থাপন করা , যখন আমাদের জিইউআই রয়েছে BackgroundWorker, ইত্যাদি etc.

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

সুতরাং আমার প্রশ্নটি হ'ল Threadউপরের কনস্ট্রাক্টগুলির পরিবর্তে কোনও সরল পুরাতন অবজেক্টটি ব্যবহার করা যখন প্রয়োজনীয় বা দরকারী তখন কোনও মামলা রয়েছে ?


4
নিটপিকের (বা সম্ভবত ... :)) নয়, তবে এটি নেট (অর্থাত্ সি # তে সীমাবদ্ধ নয়)।
মেটালমাইকস্টার

11
এই প্রশ্নের উত্তর দেওয়া একজন ব্যবহারকারীর এখনও পর্যন্ত গড় গণমাধ্যম 64.5k। বেশ চিত্তাকর্ষক প্রদর্শন
zzzzBov

1
@zzzzBov: আমি আমার নিজের উত্তর পোস্ট করার কথা ভাবছিলাম তবে এখন গড় নেমে যাওয়ার ভয়ে আমি পারব না :)
ব্রায়ান গিদিওন ২

@ ব্রায়ানজিডন, আমি আপনাকে বা অন্য কাউকে এই প্রশ্নের উত্তর দেওয়া থেকে বিরত রাখার কোনও কারণ দেখছি না।
zzzzBov

@ ব্রায়ান গিডিওন: সর্বদা, পোস্ট করুন। :)
টিউডর

উত্তর:


107

থ্রেড শ্রেণিকে অপ্রচলিত করা যায় না কারণ স্পষ্টতই এটি আপনার উল্লেখ করা অন্যান্য সমস্ত নিদর্শনগুলির একটি বাস্তবায়ন বিশদ

তবে এটি আসলে আপনার প্রশ্ন নয়; আপনার প্রশ্ন হয়

উপরোক্ত কোন একটি নির্মাণের পরিবর্তে প্লেইন পুরাতন থ্রেড অবজেক্টটি ব্যবহার করা যখন প্রয়োজনীয় বা দরকারী তখন কোনও মামলা রয়েছে?

অবশ্যই। সুনির্দিষ্টভাবে সেই ক্ষেত্রে যেখানে উচ্চ-স্তরের কোনও কনস্ট্রাক্ট আপনার চাহিদা পূরণ করে না।

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


33
সব ভাল পরামর্শ। তবে আপনার কি এমন উদাহরণ রয়েছে যেখানে একটি সরল পুরাতন থ্রেড অবজেক্টটি আরও নতুন কাঠামোর চেয়ে পছন্দনীয় হতে পারে?
রবার্ট হার্ভে

কিছু কোড লোড করার জন্য টাইমিং ইস্যুগুলির সাথে একাধিক থ্রেড ডিবাগ করা অন্য সময়ে আরও 'উচ্চ' স্তরের কনস্ট্রাক্ট ব্যবহার করে অনেক সহজ কাজ করা যায়। এবং যাইহোক থ্রেডগুলি কাজ করা এবং ব্যবহার করার প্রাথমিক জ্ঞান আপনার প্রয়োজন।
কোডিংবার্ডফিল্ড

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

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

@ এরিক: টিপিএল ডেটাফ্লো দ্বারা ইতিমধ্যে প্রস্তাবিত বিমূর্ততা কি নয় ?
অ্যালন গুরালেনেক

52

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

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

অনুরূপ শিরাতে, .NETঅ্যারে ব্যবহার নিষিদ্ধ করবেন না , এমন List<T>অনেক ক্ষেত্রে যেখানে লোকেরা অ্যারে ব্যবহার করে তার জন্য আরও উপযুক্ত despite কেবলমাত্র কারণ আপনি এখনও এমন জিনিস তৈরি করতে চাইতে পারেন যা স্ট্যান্ডার্ড লিবের আওতায় নেই।


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

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

2
আপনি দ্বিতীয় অনুচ্ছেদে "থ্রেড" শব্দটি "
অব্যবহৃত

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

3
আপনাকে বলছি সত্যিই সংক্রমণ রূপক সঙ্গে যেতে চান, অধিকাংশ অনুক্রমিক সম্প্রচার (যেমন বগুড়া এর SMG সংক্রমণ হিসাবে) হয় , আসলে, একটি কম্পিউটারের সাথে ম্যানুয়াল সম্প্রচার ছোঁ এবং গিয়ার নির্বাচক পরিচালিত। তারা প্রচলিত অটোমেটিক্সের মতো গ্রহগত গিয়ার সিস্টেম নয়।
অ্যাডাম রবিনসন

13

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

যাইহোক, আপনি চিহ্নিত হিসাবে .NET বেশ কয়েকটি উত্সর্গীকৃত বিমূর্ততা যুক্ত করেছে যা Threadঅনেক ক্ষেত্রেই বেশি পছন্দনীয় ।


9

Threadবর্গ এটি এখনও বিশেষ পরিস্থিতিতে দরকারী অপ্রচলিত নয়।

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

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


থ্রেড সরাসরি এখানে ব্যবহার করা এখানে সঠিক সমাধান কিনা তা আমার কোনও ধারণা নেই তবে আসলে থ্রেডে যাওয়ার দরকার যেখানে উদাহরণ দেওয়ার জন্য +1।
0-06

6

নতুন বিকল্পগুলি (ব্যয়বহুল) থ্রেডগুলির কম ঘন ঘন সরাসরি ব্যবহার এবং পরিচালনা করে।

লোকেরা, যখন কোনও কাজের সাথে মুখোমুখি হয় যা কিছু ধরণের সমান্তরাল সম্পাদন জড়িত থাকে তখন ভাল পুরানো থ্রেড ক্লাসটি ব্যবহার করতে সরাসরি লাফিয়ে যায়।

যা সমান্তরালে স্টাফ করার খুব ব্যয়বহুল এবং তুলনামূলকভাবে জটিল উপায়।

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


5

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

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


আমি সম্মত হই যে বেশিরভাগ শীতল নতুন সমান্তরাল জিনিসগুলি স্বল্প-মেয়াদী ছোট সূক্ষ্ম কাজগুলির চারপাশে নকশাকৃত এবং দীর্ঘ চলমান থ্রেডগুলি এখনও প্রয়োগ করা উচিত System.IO.Threading.Thread
বেন ভয়েগট

4

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


আরে, এটি আসলে বেশ ভাল উদাহরণ! ধন্যবাদ। আমি এমন ফ্রেমওয়ার্কগুলি নিয়ে ভাবিনি যা নতুন বৈশিষ্ট্যগুলিকে সমর্থন করে না।
টিউডর

3

আপনি থ্রেড ক্লাসটি ADO.NET এর সাথে তুলনা করতে পারেন। কাজটি করার জন্য এটি প্রস্তাবিত সরঞ্জাম নয়, তবে এটি অচল নয় lete কাজটি সহজ করার জন্য অন্যান্য সরঞ্জামগুলি এর উপরে তৈরি করে।

থ্রেড ক্লাসটি অন্য জিনিসের তুলনায় ব্যবহার করা ভুল নয়, বিশেষত যদি সেই জিনিসগুলি আপনার প্রয়োজনীয় কার্যকারিতা সরবরাহ করে না।


3

এটি অবশ্যই অপ্রচলিত নয়।

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

সুতরাং আমার প্রশ্নটি হ'ল উপরের কোনও নির্মাণের পরিবর্তে কোনও সরল পুরাতন থ্রেড অবজেক্টটি ব্যবহার করা যখন প্রয়োজনীয় বা দরকারী তখন কোনও মামলা রয়েছে?

গুরুতর পারফরম্যান্স সমস্যা, উচ্চ পারফরম্যান্স লক্ষ্য থাকলেই আমি থ্রেডস এবং লকগুলি নিয়ে যাব।


3

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

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

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

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