উচ্চ ট্র্যাফিকের পরিস্থিতিতে এএসপি.নেটে থ্রেডপুল.কুইউ ব্যবহারকারীবার্ক আইটেম ব্যবহার করা


111

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

সুতরাং এখন পর্যন্ত আমি কীভাবে ছোট অ্যাসিনক্রোনাস কাজগুলি করছি:

ThreadPool.QueueUserWorkItem(s => PostLog(logEvent))

এবং নিবন্ধটি এর পরিবর্তে সুস্পষ্টভাবে একটি থ্রেড তৈরি করার পরামর্শ দিচ্ছে:

new Thread(() => PostLog(logEvent)){ IsBackground = true }.Start()

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

সুতরাং আমার প্রশ্নটি হল, নিবন্ধের পরামর্শটি কি সঠিক?

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

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


প্লটটি আরও ঘন হয় - আমি এই নিবন্ধটি পেয়েছি ( ব্লগস.এমএসএনএন / নেটড / আর্কাইভ / ২০০7 / ২০১16 /১ //২ ), যা আমি বেশির মতো ডিকোড করতে পারি না। একদিকে এটি বলে যাচ্ছে বলে মনে হচ্ছে যে আইআইএস 6.0+ সর্বদা থ্রেড পুল কর্মী থ্রেডগুলিতে অনুরোধগুলি প্রক্রিয়া করে (এবং পূর্ববর্তী সংস্করণগুলি এটি করতে পারে ) তবে তারপরে এটি রয়েছে: "তবে আপনি নতুন .NET 2.0 অ্যাসিঙ্ক পৃষ্ঠা ব্যবহার করছেন ( অ্যাসিঙ্ক = "সত্য") বা থ্রেডপুল.কুইউউজারওয়ার্কআইটেম (), তারপরে প্রসেসিংয়ের অ্যাসিনক্রোনাস অংশটি [একটি সমাপ্তি বন্দর থ্রেড] এর অভ্যন্তরে সম্পন্ন হবে "" প্রক্রিয়াজাতকরণের অ্যাসিনক্রোনাস অংশ ?
জেফ স্টার্নাল

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

উত্তর:


104

এখানে অন্যান্য উত্তরগুলি সবচেয়ে গুরুত্বপূর্ণ পয়েন্টটি রেখে যাচ্ছে বলে মনে হচ্ছে:

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

এটি উভয় বিনামূল্যে থ্রেডগুলির জন্য যায় যা দ্বারা তৈরি করা হয় new Thread(...), এবং কর্মীদের থ্রেড ThreadPoolযা QueueUserWorkItemঅনুরোধের প্রতিক্রিয়া জানায়।

হ্যাঁ, এটি সত্য, আপনি অনেকগুলি কাজের আইটেম সারিবদ্ধ করে একটি এএসপি.এনইটি প্রক্রিয়ায় অনাহারে থাকতে পারেনThreadPool । এটি ASP.NET কে আরও অনুরোধগুলি প্রক্রিয়া করতে বাধা দেবে। নিবন্ধের তথ্য সেই বিষয়ে সঠিক; অনুরূপ থ্রেড পুল QueueUserWorkItemঅনুরোধগুলি পরিবেশন করতে ব্যবহৃত হয়।

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

এএসপি.এনইটি-তে মাল্টি-থ্রেড কোডটি অনুপযুক্তভাবে ব্যবহৃত হচ্ছে দেখে বা শুনেছি বেশিরভাগ সময় এটি সিপিইউ-নিবিড় কাজ সন্ধানের জন্য নয়। এটি I / O- সীমাবদ্ধ কাজের জন্য সারিবদ্ধ for এবং আপনি যদি I / O কাজ করতে চান তবে আপনার উচিত একটি I / O থ্রেড (I / O কমপ্লিট পোর্ট)।

বিশেষত, আপনি যে কোনও লাইব্রেরি ক্লাস ব্যবহার করছেন তার দ্বারা সমর্থিত অ্যাসিঙ্ক কলব্যাকগুলি ব্যবহার করা উচিত। এই পদ্ধতিগুলি সর্বদা খুব স্পষ্টভাবে লেবেলযুক্ত; তারা শব্দ Beginএবং দিয়ে শুরু End। মতই Stream.BeginRead, Socket.BeginConnect, WebRequest.BeginGetResponse, ইত্যাদি।

এই পদ্ধতির কি ব্যবহার ThreadPool, কিন্তু তারা IOCPs, যা না ব্যবহার না ASP.NET অনুরোধ হস্তক্ষেপ। এগুলি একটি বিশেষ ধরণের হালকা ওজনের থ্রেড যা I / O সিস্টেমের একটি বিঘ্নিত সংকেত দ্বারা "জাগ্রত" হতে পারে। এবং একটি এএসপি.এনইটি অ্যাপ্লিকেশনটিতে, আপনার প্রতিটি কর্মী থ্রেডের জন্য সাধারণত একটি আই / ও থ্রেড থাকে, তাই প্রতিটি অনুরোধের জন্য একটি অ্যাসিঙ্ক অপারেশন সজ্জিত থাকতে পারে। এটি আক্ষরিক অর্থে শত শত অ্যাসিঙ্ক অপারেশনগুলি কোনও উল্লেখযোগ্য কর্মক্ষমতা হ্রাস ছাড়াই (I / O সাবসিস্টেম ধরে রাখতে পারে তা ধরে নেওয়া) ass এটি আপনার প্রয়োজনের চেয়ে বেশি উপায়।

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

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

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


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

@ মিশেল: আপনি যদি আরও মাত্রা বাড়িয়ে আনতে চান তবে অ্যাসিঙ্ক কলব্যাকগুলি সাধারণত মোড়ানো সহজ pretty আপনি অ্যাসিঙ্ক পদ্ধতিগুলির চারপাশে একটি ফল তৈরি করতে Action<T>এবং উদাহরণস্বরূপ, কলব্যাক হিসাবে ব্যবহার করে এমন একক পদ্ধতিতে এগুলি মোড়ানো করতে পারেন । যদি আপনি বোঝাতে চান যে কোনও কর্মী থ্রেড বা আই / ও থ্রেড ব্যবহার করবেন কিনা তা পছন্দসই সর্বনিম্ন স্তরে ঘটে, এটি ইচ্ছাকৃত; কেবলমাত্র সেই স্তরটিই সিদ্ধান্ত নিতে পারে যে এটির আইওসিপি দরকার কিনা।
হারুনাট

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

2
আই / ও সমাপ্তি বন্দর (আইওসিপি)। আইওসিপি বর্ণনাটি সঠিক নয় correct আইওসিপি-তে আপনার কাছে স্থির সংখ্যক কর্মী থ্রেড রয়েছে যা সমস্ত বিচারাধীন কার্যগুলিতে কাজ করে। থ্রেড পুলগুলির সাথে বিভ্রান্ত হওয়ার দরকার নেই যা আকারে স্থির বা গতিশীল হতে পারে তবে কার্য প্রতি এক থ্রেড রয়েছে - ভয়াবহভাবে স্কেলগুলি। ASYNC এর বিপরীতে, আপনার কাছে প্রতি কাজ হিসাবে একটি থ্রেড নেই। আইওসিপি থ্রেডটি টাস্ক 1 এ কিছুটা কাজ করতে পারে, তারপরে টাস্ক 3, টাস্ক 2 এবং আবার টাস্ক 1 এ ফিরে যেতে পারে। টাস্ক সেশন রাষ্ট্রগুলি সংরক্ষণ করা হয় এবং থ্রেডগুলির মধ্যে পাস করা হয়।
মিকিডি

1
ডাটাবেস সন্নিবেশ সম্পর্কে কী? এএসআইএনসি এসকিউএল কমান্ড রয়েছে (এক্সিকিউটের মতো)? ডাটাবেস সন্নিবেশগুলি প্রায় আস্তে আস্তে I / O অপারেশন সম্পর্কে (লক হওয়ার কারণে) এবং সারি (গুলি) সন্নিবেশ করানোর জন্য প্রধান থ্রেডের অপেক্ষায় থাকা কেবলমাত্র CPU চক্রের অপচয়।
ইয়ান থম্পসন

45

মাইক্রোসফ্টের এএসপি.এনইটি টিমের টমাস মারকোয়াডে, এএসপি.নেট থ্রেডপুল (কুইউউজারওয়ারকআইটেম) ব্যবহার করা নিরাপদ।

নিবন্ধ থেকে :

প্রশ্ন) আমার এএসপি.নেট অ্যাপ্লিকেশন যদি সিএলআর থ্রেডপুলের থ্রেড ব্যবহার করে, তবে আমি কি এএসপি.এনইটি অনাহার করব না, যা অনুরোধগুলি সম্পাদন করতে সিএলআর থ্রেডপুল ব্যবহার করে? ..

ক) সংক্ষিপ্তসার হিসাবে, থ্রেডের এএসপি.নেট অনাহারের বিষয়ে চিন্তা করবেন না এবং যদি আপনি মনে করেন যে এখানে কোনও সমস্যা আছে তবে আমাকে জানান এবং আমরা এটি যত্ন নেব।

প্রশ্ন) আমার নিজের থ্রেডগুলি (নতুন থ্রেড) তৈরি করা উচিত? এটি এএসপি.নেটের পক্ষে আরও ভাল হবে না, কারণ এটি সিএলআর থ্রেডপুল ব্যবহার করে uses

ক) দয়া করে না। নাকি একে অন্যভাবে বললে, না !!! আপনি যদি সত্যিই স্মার্ট হন - আমার চেয়ে অনেক বেশি স্মার্ট — তবে আপনি নিজের থ্রেড তৈরি করতে পারেন; অন্যথায়, এমনকি এটি সম্পর্কে চিন্তা করবেন না। আপনার ঘন ঘন নতুন থ্রেড তৈরি না করার কয়েকটি কারণ এখানে রয়েছে:

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

4

ওয়েবসাইটগুলি স্পাডিং থ্রেডের কাছাকাছি যাওয়া উচিত নয়।

আপনি সাধারণত এই কার্যকারিতাটি একটি উইন্ডোজ পরিষেবাতে সরান যা আপনি তার সাথে যোগাযোগ করেন (আমি তাদের সাথে কথা বলার জন্য এমএসএমকিউ ব্যবহার করি)।

- সম্পাদনা করুন

আমি এখানে একটি বাস্তবায়ন বর্ণনা করেছি: এএসপি.নেট এমভিসি ওয়েব অ্যাপ্লিকেশনে ক্যু-ভিত্তিক পটভূমি প্রক্রিয়াকরণ

- সম্পাদনা করুন

কেন এটি কেবল থ্রেডগুলির চেয়ে আরও ভাল expand

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

এটি আপনাকে যে কোনও কাজ করার চেষ্টা করছে (ইমেল প্রেরণ / যাই হোক না কেন) ব্যাচ-প্রক্রিয়া করার অনুমতি দেয়।


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

অবশ্যই, তবে এটি কোনও ওয়েবসাইট থেকে অ্যাসিক্রোনাস টাস্কগুলি প্রয়োগ করার 'মানক' উপায় (কিছু অন্যান্য প্রক্রিয়ার বিরুদ্ধে সারি থিম)।
দুপুর সিল্ক

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

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

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

4

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

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

কর্মক্ষমতা যদি কোনও সমস্যা হয়ে দাঁড়ায় এবং আপনি স্থির করতে পারেন যে থ্রেড পুলটি সীমাবদ্ধ ফ্যাক্টর (এবং ডাটাবেস সংযোগ নয়, বহির্গামী নেটওয়ার্ক সংযোগগুলি, মেমরি, পৃষ্ঠা টাইমআউটস ইত্যাদি) তবে আপনি আরও কর্মী থ্রেড, উচ্চতর সারিযুক্ত অনুরোধগুলি মঞ্জুর করার জন্য থ্রেড পুল কনফিগারেশনটি টুইঙ্ক করেন you ইত্যাদি

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

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


2

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

http://blogs.msdn.com/tmarq/archive/2010/04/14/performing-asynchronous-work-or-tasks-in-asp-net-applications.aspx

ধন্যবাদ, টমাস


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

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

1

নিবন্ধটি সঠিক নয়। ASP.NET এর এএসপি.নেট অনুরোধগুলি পরিবেশন করার জন্য এটি নিজস্ব থ্রেড, পরিচালিত কর্মী থ্রেড রয়েছে। এই পুলটি সাধারণত কয়েক শতাধিক থ্রেড হয় এবং থ্রেডপুল পুল থেকে পৃথক, যা প্রসেসরের কিছু ছোট একাধিক।

ASP.NET এ থ্রেডপুল ব্যবহার করা ASP.NET কর্মী থ্রেডে হস্তক্ষেপ করবে না। থ্রেডপুল ব্যবহার করা ভাল।

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

প্রতিটি বার্তার জন্য একটি নতুন থ্রেড ব্যবহার করা অবশ্যই ওভারকিল।

অন্য বিকল্প, যদি আপনি কেবল লগিংয়ের কথা বলছেন তবে লগ 4 নেট এর মতো একটি লাইব্রেরি ব্যবহার করা। এটি পৃথক থ্রেডে লগিং পরিচালনা করে এবং সেই প্রসঙ্গে যে সমস্ত প্রসঙ্গের বিষয় আসতে পারে সেগুলির যত্ন নেয়।


1
@ সাম, আমি আসলে লগ 4 নেট ব্যবহার করছি এবং লগগুলি পৃথক থ্রেডে লেখা হচ্ছে না দেখছি - এমন কোনও ধরণের বিকল্প আছে যা আমার সক্ষম করার দরকার?
মাইকেল হার্ট

1

আমি বলব নিবন্ধটি ভুল। আপনি যদি একটি বড় নেট নেট চালাচ্ছেন তবে আপনি থ্রেডপুল ডকুমেন্টেশনের একটি বিবৃতি ভিত্তিতে কেবল একাধিক অ্যাপ্লিকেশন এবং একাধিক ওয়েবসাইটের (পৃথক অ্যাপ পুলগুলি ব্যবহার করে) নিরাপদে পুলটি ব্যবহার করতে পারেন :

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


একটি একক প্রক্রিয়াতে চলমান একটি অ্যাপ্লিকেশন নিজেকে নিচে আনতে সম্পূর্ণ সক্ষম! (বা কমপক্ষে থ্রেড পুলকে হারানোর প্রস্তাব হিসাবে তৈরি করার জন্য তার নিজস্ব পারফরম্যান্সকে যথেষ্ট পরিমাণে হ্রাস করা
জেফ স্টার্নাল

সুতরাং আমি অনুমান করছি এএসপি.নেট অনুরোধগুলি I / O সমাপ্তির থ্রেডগুলি ব্যবহার করে (কর্মী থ্রেডের বিপরীতে) - এটি কি সঠিক?
মাইকেল হার্ট

ফ্রিটজ পেঁয়াজের আর্টিকেল থেকে আমি আমার উত্তরে লিঙ্ক করেছি: "এই দৃষ্টান্তটি [আইআইএস 5.0 থেকে আইআইএস 6.0 থেকে] পরিবর্তিত হয়। অনুরোধগুলি এএসপি.নেটে হ্যান্ডেল করা হয়। ইনটিনফো.এক্সই থেকে এএসপি.নেট কর্মী প্রক্রিয়াতে অনুরোধ প্রেরণের পরিবর্তে, এইচপি। যথাযথ প্রক্রিয়াতে প্রতিটি অনুরোধকে সরাসরি কাতারে দেখায় Thus সুতরাং সমস্ত অনুরোধগুলি এখন সিএলআর থ্রেড পুল থেকে আঁকা কর্মী থ্রেড দ্বারা পরিবেশন করা হয় এবং কখনও আই / ও থ্রেডে থাকে না । " (আমার জোর)
জেফ স্টার্নাল

হুম, আমি এখনও পুরোপুরি নিশ্চিত নই ... সেই নিবন্ধটি ২০০৩ সালের জুনের। আপনি যদি 2004 সালের মে থেকে এটি স্বীকার করেন (স্বীকার করেছেন এখনও বেশ পুরানো), এটি বলেছে "দ্য স্লিপ.এএসপিএক্স পরীক্ষার পৃষ্ঠাটি একটি এএসপি রাখতে ব্যবহার করা যেতে পারে .NET ইনপুট / আউটপুট থ্রেড ব্যস্ত ", যেখানে Sleep.aspx বর্তমান ঘুমাতে থ্রেড নির্বাহ কারণ: msdn.microsoft.com/en-us/library/ms979194.aspx - যখন আমি একটি সুযোগ পেয়েছেন, আমি দেখতে পাবেন যদি আমি সেই উদাহরণটি কোড করতে পারি এবং আইআইএস 7 এবং .NET 3.5 এ পরীক্ষা করতে পারি
মাইকেল হার্ট

হ্যাঁ, সেই অনুচ্ছেদের পাঠটি বিভ্রান্তিকর। বিভাগটির আরও দূরে এটি একটি সমর্থন বিষয়ের সাথে যুক্ত হয় ( support.microsoft.com/default.aspx?scid=kb ;EN-US ;816829 ) যা বিষয়গুলি স্পষ্ট করে: I / O সমাপ্তির থ্রেডে অনুরোধগুলি চালনা একটি নেট নেট ফ্রেমওয়ার্ক 1.0 ASP.NET 1.1 জুন 2003 হটফিক্স রোলআপ প্যাকেজ (যার পরে "সমস্ত অনুরোধ এখন কর্মী থ্রেডে চালিত হয়") এ ঠিক করা সমস্যা problem আরও গুরুত্বপূর্ণ, এই উদাহরণটি পুরোপুরি স্পষ্টভাবে দেখায় যে ASP.NET থ্রেড পুলটি একই থ্রেড পুল দ্বারা প্রকাশিত System.Threading.ThreadPool
জেফ স্টার্নাল

1

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

  1. কিছু পৃষ্ঠার জন্য একটি অনুরোধ করা হয়
  2. এইচটিএমএল ফিরে দেওয়া হয়
  3. এইচটিএমএল ক্লায়েন্টকে আরও অনুরোধগুলি তৈরি করতে বলে (জেএসএস, সিএসএস, চিত্র ইত্যাদি) ..
  4. আরও তথ্য ফিরে দেওয়া হয়

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

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

থ্রেড বনাম প্রক্রিয়া

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

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

উৎস


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

0

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

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

পরিশেষে নিবন্ধটি থ্রেডপুল ব্যবহারের ঝুঁকিগুলি সম্পর্কে কিছু সুন্দর ঝাপটা বক্তব্য তৈরি করেছে তবে সেগুলি ব্যাক আপ করার জন্য সত্যিকারের কিছু প্রয়োজন।


0

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

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


0

আপনি সমান্তরাল ব্যবহার করতে পারেন বা সমান্তরাল.ফরচারভাবে চালানোর জন্য এবং পুল অনাহার প্রতিরোধের জন্য আপনি যে থ্রেড বরাদ্দ করতে চান তার প্রতিটি সীমা নির্ধারণ করুন এবং নির্ধারণ করুন।

তবে ব্যাকগ্রাউন্ডে চালিত হওয়ার জন্য আপনাকে নীচে খালি টিপিএল স্টাইলটি এএসপি. নেট ওয়েব অ্যাপ্লিকেশনটিতে ব্যবহার করতে হবে।

var ts = new CancellationTokenSource();
CancellationToken ct = ts.Token;

ParallelOptions po = new ParallelOptions();
            po.CancellationToken = ts.Token;
            po.MaxDegreeOfParallelism = 6; //limit here

 Task.Factory.StartNew(()=>
                {                        
                  Parallel.ForEach(collectionList, po, (collectionItem) =>
                  {
                     //Code Here PostLog(logEvent);
                  }
                });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.