Co je to vlákno pool?

Jak by se dalo implementovat podproces? Četl jsem na wikipedii pro „threadpool“, ale stále nemůžu přijít na to, co by měl člověk udělat pro vyřešení této otázky (možná proto, že jsem úplně nerozuměl, co vlastně je threadpool).

Může mi někdo v obyčejné angličtině vysvětlit, co je threadpool a jak by někdo odpověděl na tuto otázku?

Odpověď

Vlákno pool je skupina předem vytvořených nečinných podprocesů, které jsou připraveny na práci. Ty jsou upřednostňovány před vytvářením nových podprocesů pro každý úkol, pokud je třeba udělat velký počet krátkých úkolů, spíše než malý počet dlouhých. Tím se zabrání tomu, abyste museli nést režii vytváření vlákna mnohokrát.

Implementace se bude lišit podle prostředí, ale ve zjednodušeném smyslu potřebujete následující:

  • Způsob, jak vytvořit vlákna a držet je v nečinném stavu. Toho lze dosáhnout tak, že každé vlákno bude čekat na bariéře, dokud to předá fond. (To lze provést pomocí mutexů také.)
  • Kontejner pro uložení vytvořených vláken, například fronty nebo jakékoli jiné struktury, která má způsob, jak přidat vlákno do fondu a jedno z nich vytáhnout.
  • Standardní rozhraní nebo abstraktní třída pro vlákna, která se mají použít při práci. Může to být abstraktní třída s názvem Task s metodou execute(), která provede práci a poté se vrátí.

Když je vytvořen fond podprocesů, vytvoří buď instanci určitého počtu podprocesů, které mají být zpřístupněny, nebo podle potřeby vytvoří nová v závislosti na potřebách implementace.

Když je předán fond Task, vezme vlákno z kontejneru (nebo čeká na zpřístupnění, pokud je kontejner prázdný), předá mu Task, a splňuje bariéru. To způsobí, že se nečinné vlákno znovu spustí, a to vyvoláním metody execute() metody Task, která byla dána. Jakmile je spuštění dokončeno, vlákno se vrátí zpět do fondu, který má být vložen do kontejneru k opětovnému použití, a poté narazí na svou bariéru, čímž se uspí, dokud se cyklus nebude opakovat.

Komentáře

  • Fond vláken je skupina předem vytvořených nečinných vláken, která jsou připravena k práci. […] Tím se zabrání tomu, abyste museli nést režii vytváření vlákna mnohokrát. – Google by to měl vyplivnout, kdykoli někdo hledá vlákno " pool "
  • Zahrnuje tvorba fondu vláken interně bariéru? Můžete sdílet odkaz na těchto řádcích?
  • @overexchange Ne, není. Můj odkaz na tuto otázku byl příkladem lepšího způsobu, jak přepsat vaši bariérovou otázku . (Pokud ano, napíšu odpověď.)
  • jedna z nejlepších krátkých odpovědí.

odpověď

Fond vláken je kolekce spravovaných vláken, obvykle uspořádaných do fronty, které provádějí úkoly ve frontě úloh.

Vytvoření nového objektu vlákna pokaždé, když potřebujete něco provést asynchronně, je nákladné. Ve fondu vláken byste jen přidali úkoly, které chcete provést asynchronně, do fronty úkolů a fond vláken se postará o přiřazení dostupného vlákna, pokud existuje, pro odpovídající úkol. Jakmile je úkol dokončen, nyní dostupné vlákno požaduje další úkol (za předpokladu, že ještě nějaký zbývá).

Fond vláken vám pomůže vyhnout se vytvoření nebo zničení více vláken, než by bylo skutečně nutné.

Začal bych vytvořením třídy s frontou vláken a frontou úkolů. Pak implementujte metodu, která přidá úkol do fronty úkolů a odtud pokračujte. Je zřejmé, že byste měli také umožnit nastavit maximální povolená vlákna ve fondu vláken.

Odpovědět

Příklad z reálného života;

  1. Zařízení: Operační systém
  2. Sekce: Aplikace
  3. Lidé: Vlákna

Máte tam zařízení 12 lidí pracuje. K dispozici jsou 3 sekce tohoto zařízení. Kuchyně, toalety a ostraha. Pokud nepoužíváte techniku sdružování vláken, tak to funguje: Všech 12 lidí bude stát v zasedací místnosti, pokud přijdou noví zákazníci podle zařízení a požádají o úkoly, pak oddělíte lidi ve skupinách a pošlete je svou práci a vrátit se do zasedací místnosti. Ale než se pustí do služby, je zde přípravná fáze. Musí nosit správnou uniformu, vybavit určitá zařízení a jít do této sekce, dokončit práci a vrátit se. Takže jednou pokaždé, když dokončí svou práci (končí vlákno), musí se vrátit zpět do zasedací místnosti, svléknout uniformu, vytáhnout vybavení a počkat na další práci. Ty odkazují na vytváření kontextu vlákna, je to alokace paměti a sledování informací operačním systémem.Přeorganizovat nové potřeby podprocesů je pro OS příliš časově náročné.

Pokud používáte sdružování podprocesů, brzy ráno přiřadíte 6 osob do kuchyně, 2 osoby do toalety a 4 osoby k bezpečnosti. Přípravu tedy budou provádět pouze jednou denně. I když v kuchyni nejsou žádní zákazníci, tito 4 lidé tam budou, při volnoběhu, pro jakékoli nadcházející úkoly. Nemusí se vracet do zasedací místnosti, dokud se kuchyně nezavře (aplikace končí). Tito 4 lidé jsou v bazénu aplikací Kitchen a jsou připraveni rychle sloužit. Ale nemůžete slíbit, že pracují celý den, protože kuchyň může být čas od času nečinná. Stejná logika platí i pro toalety a bezpečnost.

V prvním scénáři neztrácíte žádné vlákno pro žádný úkol, ALE připravit každé vlákno pro každý úkol bude trvat dost času. V druhém případě si vlákna připravíte předem, takže nemůžete zaručit, že budete používat všechna vlákna pro všechny úkoly, ale OS na nich většinou dělá velkou optimalizaci, takže se na ně můžete spolehnout.

Odpověď

Ve vícevláknové aplikaci je fond vláken „fondem dostupných vláken“, který může vaše aplikace použít. Obvykle např. .NET, je to všechno spravováno, takže stačí přiřadit úkoly a jakmile je vlákno volné, bude to provádět. Takže k implementaci podprocesu bych očekával vytvoření konceptu, kde jsou úkoly automaticky přijímány volnými podprocesy bez explicitního vytváření podprocesů pro každý úkol.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *