SemaphoreSlim ব্যবহার বুঝতে হবে


90

আমার কোডটি এখানে রয়েছে তবে আমি কী করছি তা বুঝতে পারছি SemaphoreSlimনা।

async Task WorkerMainAsync()
{
    SemaphoreSlim ss = new SemaphoreSlim(10);
    List<Task> trackedTasks = new List<Task>();
    while (DoMore())
    {
        await ss.WaitAsync();
        trackedTasks.Add(Task.Run(() =>
        {
            DoPollingThenWorkAsync();
            ss.Release();
        }));
    }
    await Task.WhenAll(trackedTasks);
}

void DoPollingThenWorkAsync()
{
    var msg = Poll();
    if (msg != null)
    {
        Thread.Sleep(2000); // process the long running CPU-bound job
    }
}

কি অপেক্ষা ss.WaitAsync();এবং ss.Release();কি করে?

আমি অনুমান করি যে আমি যদি একবারে 50 টি থ্রেড চালাই তবে কোডটি লিখুন SemaphoreSlim ss = new SemaphoreSlim(10);তবে এটি সময়ে 10 টি সক্রিয় থ্রেড চালাতে বাধ্য হবে।

10 টির মধ্যে একটি যখন সম্পূর্ণ হবে তখন অন্য থ্রেড শুরু হবে। আমি যদি ঠিক না থেকে থাকে তবে আমাকে নমুনা পরিস্থিতি বুঝতে সাহায্য করুন।

awaitপাশাপাশি কেন প্রয়োজন হয় ss.WaitAsync();? কি করে ss.WaitAsync();?


4
একটি বিষয় লক্ষণীয় হ'ল আপনার অবশ্যই সেই "ডোপলিংথেন ওয়ার্কসাইক (); একটি "চেষ্টা করুন {ডোপলিংথেন ওয়ার্কএন্সিঙ্ক ();} অবশেষে s এস। রিলিজ ();।", অন্যথায় ব্যতিক্রমগুলি স্থায়ীভাবে সেই সেমফোর্ডে অনাহারে থাকবে।
অস্টিন সালগাত

আমি কিছুটা অদ্ভুত বোধ করি যে আমরা যথাক্রমে টাস্কের বাইরে / অভ্যন্তরে সেমফোরটি অর্জন এবং প্রকাশ করি। "প্রতীক্ষিত এসএস.ওয়েটএেন্সেক ()" টাস্কের অভ্যন্তরে স্থানান্তরিত করা কি কোনও পার্থক্য আনবে?
শেন লু

উত্তর:


73

আমার ধারণা আমি যদি একবারে 50 টি থ্রেড চালাই তবে সেম্যাফোরস্লিম এসএস = নতুন সেমফোরস্লিম (10) এর মতো কোড; সময়ে 10 টি সক্রিয় থ্রেড চালাতে বাধ্য করবে

ঐটা ঠিক; সেমফোরের ব্যবহার নিশ্চিত করে যে একই সাথে 10 টিরও বেশি শ্রমিক এই কাজটি করবে না।

WaitAsyncসেমফোরে কল করে এমন একটি টাস্ক তৈরি করা হয় যা যখন সেই থ্রেডটিকে সেই টোকেনটিতে "অ্যাক্সেস" দেওয়া হবে তখন সম্পূর্ণ হবে। await-সই কাজটি প্রোগ্রামটিকে "মঞ্জুরি" দেওয়া হলে এটি কার্যকর করা চালিয়ে যেতে দেয়। কল করার পরিবর্তে একটি অ্যাসিনক্রোনাস সংস্করণ থাকা, Waitপদ্ধতিটি সুসংগত হওয়ার পরিবর্তে অ্যাসিঙ্ক্রোনাস থাকে তা নিশ্চিত করার পাশাপাশি উভয় asyncক্ষেত্রে কলব্যাকের কারণে কোনও পদ্ধতি বিভিন্ন থ্রেডে কোড সম্পাদন করতে পারে, এই বিষয়টি নিয়ে ডিল করা গুরুত্বপূর্ণ both semaphores সঙ্গে প্রাকৃতিক থ্রেড সংযোগ একটি সমস্যা হতে পারে।

একটি পার্শ্ব নোট: পোস্টফিক্সটি DoPollingThenWorkAsyncথাকা উচিত নয় Asyncকারণ এটি আসলে অ্যাসিনক্রোনাস নয়, এটি সিনক্রোনাস। শুধু এটি কল DoPollingThenWork। এটি পাঠকদের জন্য বিভ্রান্তি হ্রাস করবে।


ধন্যবাদ তবে দয়া করে আমাকে বলুন যখন আমরা চালানোর জন্য কোনও থ্রেড নির্দিষ্ট না করে বলি 10.10 থ্রেডের মধ্যে একটি যখন শেষ হয় তখন আবার সেই থ্রেডটি অন্য কাজ শেষ করে বা পুলটিতে ফিরে যায়? এটি খুব স্পষ্ট নয় .... সুতরাং দয়া করে ঘটনার পিছনে কী ঘটে তা ব্যাখ্যা করুন।
মৌ

@ মৌ এটি সম্পর্কে কি পরিষ্কার নয়? বর্তমানে 10 টিরও কম টাস্ক না হওয়া পর্যন্ত কোডটি অপেক্ষা করে; যখন আছে, এটি অন্য যুক্ত করে। কোনও কাজ শেষ হয়ে গেলে এটি ইঙ্গিত করে যে এটি শেষ হয়েছে। এটাই.
পরিবেশন করুন

চালানোর জন্য কোনও থ্রেড নির্দিষ্ট করার সুবিধা কী। যদি খুব বেশি থ্রেড পারফরম্যান্সে বাধা সৃষ্টি করতে পারে? যদি হ্যাঁ হয় তবে কেন বাধা আছে ... যদি আমি 10 থ্রেডের পরিবর্তে 50 টি থ্রেড চালাই তবে কেন পারফরম্যান্সের বিষয়টি বিবেচিত হবে ... আপনি দয়া করে ব্যাখ্যা করতে পারেন। ধন্যবাদ
থমাস

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

4
@ সার্ভি এটি টাস্ক শিডিয়ুলারের কাজের অংশ। টাস্ক! = থ্রেড। Thread.Sleepমূল কোডে কাজের সূচি ধ্বংশ হবে। আপনি যদি কোরটিতে অ্যাসিঙ্ক না হন তবে আপনি অ্যাসিঙ্ক নন।
জোসেফ লেনাক্স

54

কিন্ডার চারপাশের কিন্ডারগার্ডেনে তারা কতগুলি বাচ্চা পিই ঘরে খেলতে পারে তা নিয়ন্ত্রণ করতে একটি সেমফোরস্লিম ব্যবহার করে।

তারা ঘরের বাইরে মেঝেতে 5 জোড়া পায়ের ছাপ আঁকেন।

বাচ্চারা আসার সাথে সাথে তারা বিনামূল্যে জুতা পায়ের ছাপ রেখে জুতো প্রবেশ করে।

একবার তারা খেলে শেষ হয়ে গেলে তারা বাইরে আসেন, তাদের জুতা সংগ্রহ করুন এবং অন্য বাচ্চার জন্য একটি স্লট "মুক্তি" দিন।

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

যখন কোনও শিক্ষক আশেপাশে থাকেন, তখন তিনি করিডোরের অন্য পাশে 5 টি পায়ের ছাপগুলির একটি অতিরিক্ত সারি "প্রকাশ" করেন যাতে একই সময়ে ঘরে আরও 5 বাচ্চা খেলতে পারে।

এটিতে সেমফোরস্লিমের একই "ক্ষতি" রয়েছে ...

যদি কোনও বাচ্চা খেলা শেষ করে জুতা সংগ্রহ না করে ঘর ছেড়ে যায় ("রিলিজ" ট্রিগার করে না) তবে তাত্ত্বিকভাবে একটি খালি স্লট থাকলেও স্লটটি অবরুদ্ধ থাকবে। যদিও বাচ্চাটি সাধারণত জানানো হয়।

কখনও কখনও দু'জন দুজন ছদ্ম ছাগলছানা অন্য কোথাও তাদের জুতা লুকিয়ে ঘরে প্রবেশ করে, এমনকি সমস্ত পায়ের ছাপ ইতিমধ্যে নেওয়া হলেও (যেমন, সেম্যাফোরস্লিম রুমে কত বাচ্চা রয়েছে "সত্যই" নিয়ন্ত্রণ করে না)।

এটি সাধারণত ভালভাবে শেষ হয় না, যেহেতু ঘরের উপচে পড়া ভিড় বাচ্চাদের কাঁদে এবং শিক্ষক পুরোপুরি ঘরটি বন্ধ করে দেয়।


4
এই ধরণের উত্তরগুলি আমার প্রিয়।
আমার স্ট্যাক ওভারফ্লোথ

ওএমজি হেক হিসাবে এটি তথ্যপূর্ণ এবং মজার!
জোনাস

7

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

http://www.tomdupont.net/2016/03/how-to-release-semaphore-with- using.html

আমি swap 'র করেনি _isDisposed=trueএবং _semaphore.Release()যদিও ক্ষেত্রে এটি একরকম একাধিক বার বলা পেয়েছিলাম তার সৎকার চারপাশে।

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

প্রশ্নগুলির কোড-গুণমান সম্পর্কে রিলিজটি সর্বদা প্রকাশিত হয় তা নিশ্চিত করার চেষ্টা করে শেষ পর্যন্ত চেষ্টা করা শেষ।


6
লিঙ্কগুলি কেবলমাত্র উত্তরগুলি পোস্ট করা অবিচ্ছিন্ন কারণ যেহেতু লিঙ্কগুলি সময়ের সাথে সাথে মৃত্যুর প্রবণতা উত্তর অযোগ্য করে দেয়। আপনি যদি পারেন তবে আপনার উত্তরের মূল পয়েন্টগুলি বা কী কোড ব্লকটির সংক্ষিপ্ত বিবরণ দেওয়া ভাল।
জন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.