আমার কাছে সমস্ত উত্তর নেই। আশা করি আমি এর উপর কিছুটা আলোকপাত করতে পারব।
.NET- র থ্রেডিং মডেলগুলি সম্পর্কে আমার পূর্ববর্তী বিবৃতিগুলি সহজ করার জন্য, কেবলমাত্র জেনে থাকুন যে সমান্তরাল গ্রন্থাগারটি টাস্কগুলি ব্যবহার করে, এবং কার্যগুলির জন্য ডিফল্ট টাস্কশেডুলার থ্রেডপুল ব্যবহার করে। আপনি স্তরক্রমের উচ্চতর যান (থ্রেডপুল নীচে রয়েছে), আইটেমগুলি তৈরি করার সময় আপনার যত বেশি ওভারহেড পাবেন। অতিরিক্ত অতিরিক্ত মাথার অর্থ অবশ্যই এটি ধীর নয়, তবে এটি সেখানে রয়েছে তা জেনে রাখা ভাল। শেষ পর্যন্ত একটি বহু-থ্রেড পরিবেশে আপনার অ্যালগরিদমের কর্মক্ষমতা তার নকশায় নেমে আসে। ক্রমানুসারে যা ভাল সম্পাদন করে তা সমান্তরালে ভাল পারফর্ম করতে পারে না। আপনাকে কঠোর এবং দ্রুত নিয়মগুলি দেওয়ার জন্য অনেকগুলি বিষয় জড়িত রয়েছে, আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে তারা পরিবর্তিত হয়। যেহেতু আপনি নেটওয়ার্কের অনুরোধগুলির সাথে কাজ করছেন, আমি চেষ্টা করব এবং একটি ছোট উদাহরণ দেব।
আমাকে জানিয়ে দিন যে আমি সকেটগুলিতে কোনও বিশেষজ্ঞ নই এবং আমি জেরোক-আইস সম্পর্কে কিছুই জানিনা। আমি অ্যাসিক্রোনাস অপারেশন সম্পর্কে বিট সম্পর্কে জানি না এবং এটিই এটি আপনাকে সত্যই সহায়তা করবে। আপনি যদি সকেটের মাধ্যমে একটি সংক্রামিত অনুরোধটি প্রেরণ করেন, যখন আপনি কল করবেন Socket.Receive()
, কোনও অনুরোধ না পাওয়া পর্যন্ত আপনার থ্রেডটি ব্লক হয়ে যাবে। এটা ভাল না। আপনার থ্রেডটি অবরুদ্ধ হওয়ার পরে আর কোনও অনুরোধ করতে পারে না। সকেট। এর অর্থ, আপনার থ্রেডটি আসলে কোনও লিংক ছাড়াই কোনও লুপে হাজার হাজার অনুরোধ করতে পারে!
যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি নিজের পরীক্ষার কোডে জেরোক-আইস মাধ্যমে কলগুলি ব্যবহার করছেন, কোনও HTTP শেষ পয়েন্টে পৌঁছানোর চেষ্টা করছেন না। যদি এটি হয় তবে আমি স্বীকার করতে পারি যে জেরোক-আইস কীভাবে কাজ করে তা আমি জানি না। আমি অবশ্য নিম্নলিখিত সুপারিশ করবে এখানে তালিকাভুক্ত পরামর্শ , বিশেষ করে অংশ: Consider Asynchronous Method Invocation (AMI)
। পৃষ্ঠাটি এটি দেখায়:
এএমআই ব্যবহার করে ক্লায়েন্ট নিমন্ত্রণ প্রেরণের সাথে সাথেই নিয়ন্ত্রণের সূত্রটি পুনরায় অর্জন করে (বা এটি যদি তাত্ক্ষণিকভাবে প্রেরণ করা যায় না, সারি সজ্জিত করা হয়েছে), ক্লায়েন্টকে সেই থ্রেডটি মাঝের সময়ে অন্যান্য দরকারী কাজ সম্পাদনের অনুমতি দেয় ।
যা আমি উপরে নেট সকেট ব্যবহার করে উপরে বর্ণিত সামগ্রীর সমতুল্য বলে মনে হচ্ছে। প্রচুর প্রেরণের চেষ্টা করার সময় পারফরম্যান্সের উন্নতি করার অন্যান্য উপায় থাকতে পারে তবে আমি এখানে বা সেই পৃষ্ঠায় তালিকাভুক্ত অন্য কোনও পরামর্শ দিয়ে শুরু করব। আপনার অ্যাপ্লিকেশনটির নকশা সম্পর্কে আপনি খুব অস্পষ্ট হয়ে পড়েছেন, সুতরাং আমি আমার উপরের তুলনায় আরও নির্দিষ্ট হতে পারি। শুধু মনে রাখবেন, আপনার যা করা দরকার তা পেতে একেবারে প্রয়োজনের চেয়ে বেশি থ্রেড ব্যবহার করবেন না, না হলে আপনি সম্ভবত আপনার অ্যাপ্লিকেশনটি আপনার চেয়ে ধীর গতিতে চলতে দেখবেন।
সিউডোকোডের কয়েকটি উদাহরণ (আমাকে আসলে এটি শিখতে না দিয়ে এটিকে যথাসম্ভব বরফের কাছাকাছি করার চেষ্টা করা হয়েছিল):
var iterations = 100000;
for (int i = 0; i < iterations; i++)
{
// The thread blocks here waiting for the response.
// That slows down your loop and you're just wasting
// CPU cycles that could instead be sending/receiving more objects
MyObjectPrx obj = iceComm.stringToProxy("whateverissupposedtogohere");
obj.DoStuff();
}
একটি ভাল উপায়:
public interface MyObjectPrx : Ice.ObjectPrx
{
Ice.AsyncResult GetObject(int obj, Ice.AsyncCallback cb, object cookie);
// other functions
}
public static void Finished(Ice.AsyncResult result)
{
MyObjectPrx obj = (MyObjectPrx)result.GetProxy();
obj.DoStuff();
}
static void Main(string[] args)
{
// threaded code...
var iterations = 100000;
for (int i = 0; i < iterations; i++)
{
int num = //whatever
MyObjectPrx prx = //whatever
Ice.AsyncCallback cb = new Ice.AsyncCallback(Finished);
// This function immediately gets called, and the loop continues
// it doesn't wait for a response, it just continually sends out socket
// requests as fast as your CPU can handle them. The response from the
// server will be handled in the callback function when the request
// completes. Hopefully you can see how this is much faster when
// sending sockets. If your server does not use an Async model
// like this, however, it's quite possible that your server won't
// be able to handle the requests
prx.GetObject(num, cb, null);
}
}
মনে রাখবেন যে আরও থ্রেড! = সকেট প্রেরণের চেষ্টা করার সময় আরও ভাল পারফরম্যান্স (বা সত্যিই কিছু করা হচ্ছে)। থ্রেডগুলিতে যাদু নয় যে আপনি যে কোনও সমস্যা নিয়ে কাজ করছেন তা স্বয়ংক্রিয়ভাবে সমাধান করবে solve আদর্শভাবে, আপনি মূল প্রতি 1 টি থ্রেড চান, যদি না কোনও থ্রেড তার অপেক্ষা করার জন্য বেশিরভাগ সময় ব্যয় করে, তবে আপনি আরও বেশি করে যুক্তি প্রমাণ করতে পারবেন। প্রতিটি অনুরোধকে তার নিজস্ব থ্রেডে চালানো একটি খারাপ ধারণা, কারণ প্রসঙ্গের স্যুইচগুলি ঘটবে এবং সংস্থানসমূহের অপচয় হবে। (যদি আমি এই বিষয়ে আমার লেখা সমস্ত কিছু যদি দেখতে চান তবে সম্পাদনা ক্লিক করুন এবং এই পোস্টের অতীতের সংশোধনগুলি দেখুন I আমি এটিকে অপসারণ করেছি কারণ এটি কেবল হাতে মুখ্য বিষয়কে মেঘলা বলে মনে হয়েছে))
আপনি প্রতি সেকেন্ডে বিপুল সংখ্যক অনুরোধ করতে চাইলে আপনি অবশ্যই থ্রেডগুলিতে এই অনুরোধটি করতে পারবেন। তবে, থ্রেড তৈরির সাথে ওভারবোর্ডে যাবেন না। একটি ভারসাম্য খুঁজে এটির সাথে থাকা। আপনি যদি একটি সিঙ্ক্রোনাস বনাম অ্যাসিক্রোনাস মডেল ব্যবহার করেন তবে আপনি আরও ভাল পারফরম্যান্স পাবেন।
আমি আশা করি এটি সাহায্য করবে.