Co je to pool vláken? Proč používat thread pooly? Jak používat thread pooly?
1. Co je to pool vláken?
Třída ThreadPool v .NET Frameworku poskytuje pool vláken, který lze použít k provádění úloh, odesílání pracovních položek, zpracování asynchronních I/O, čekání jménem ostatních vláken a řešení časovačů. Co je to tedy thread pool? Pool vláken je ve skutečnosti "pool", který ukládá objekty vláken a poskytuje základní metody, jako je nastavení minimálního/maximálního počtu vláken v poolu, frontování metod k vykonání atd. ThreadPool je statická třída, takže ji lze používat přímo bez vytváření objektů.
2. Proč používat thread pools? Jaké jsou výhody?
Oficiální web Microsoftu uvádí následující: Mnoho aplikací vytváří velké množství vláken, která jsou v režimu spánku a čekají na události. Existuje také mnoho vláken, která mohou přejít do hibernace jen proto, aby se občas probudila a ptala se na změněné nebo aktualizované informace o stavu. Pooly vláken umožňují efektivněji využívat vlákna prostřednictvím poolu pracovních vláken spravovaných systémem.
Jednoduše řečeno, každé nové vlákno musí zabírat paměťový prostor a další zdroje, a s tolika novými vlákny je mnoho z nich nečinných nebo čeká na uvolnění zdrojů. Existuje mnoho vláken, která dělají jen drobné práce periodicky, například obnovování dat apod., což je příliš zbytečné na kreslení, a je vzácné, aby velké množství vláken vybuchlo v reálném programování a skončilo během krátké doby. Proto byl navržen koncept thread poolů. Pokud aplikace odešle další požadavek na pool vláken, vlákno ve stavu čekajícího na vlákenku je aktivováno a úkol vykoná bez vytvoření nového vlákna, což šetří značnou zátěž. Systém automaticky zničí vlákna pouze tehdy, když počet vláken dosáhne maximálního počtu. Proto použití poolů vláken může předejít vysokým nákladům na tvorbu a depozici, zajistit lepší výkon a stabilitu, a za druhé se vývojáři mohou soustředit na jiné úkoly tím, že vlákna předají správci systému.
3. Jak používám thread pooly?
Ve skutečnosti jsou thread pooly velmi jednoduché na použití, a to následuje
a. Nastavte maximální a minimální pool vláken:
ThreadPool.SetMaxThreads (int workerThreads,int completionPortThreads) Nastavte počet požadavků pro pool vláken, která mohou být aktivní současně. Všechny požadavky s vyšším než tímto číslem zůstanou ve frontě, dokud nebude vlákno poolu vláken dostupné. Můžete také nastavit minimální počet vláken.
b. Přidat úkoly do poolu vláken:
ThreadPool.QueueUserWorkItem(new WaitCallback(název metody));
nebo ThreadPool.QueueUserWorkItem(nový WaitCallback(název metody), parametr);
Například pokud maximálně 5 vláken v poolu provede metodu 60krát, celkový plat za 5 let je následující:
Pokud nepoužíváte poolování vláken, možná budete muset otevřít 60 vláken, abyste mohli asynchronně spustit metodu Run(), což je plýtvání místem. Nyní používáme až 5 vláken, která lze spustit za 1 sekundu, a efektivita i výkon jsou velmi dobré.
|