Když jsem se neměli používat ThreadPool .NET?

hlasů
36

Kdy mám to používat ThreadPool .NET?

Vypadá to, že nejlepší možností je použít ThreadPool, v takovém případě, proč není to jediná možnost?

Jaké jsou vaše zkušenosti vyřešit tento problém?

Položena 13/08/2008 v 20:24
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
28

@Eric, budu muset souhlasit s Deanem. Závity jsou drahé. Nelze předpokládat, že váš program je jediný běh. Kdy každý je chamtivý s prostředky, problém násobí.

Raději ručně vytvořit své téma a řídit je sám. Udržuje kódu velmi snadno pochopitelné.

To je v pořádku, když je to vhodné. Pokud budete potřebovat spoustu pracovních vláken, i když všechno, co jste udělal, je, aby váš kód složitější. Nyní musíte napsat kód pro jejich správu. Pokud jste právě použili bazén vlákno, měli byste získat všechny vedení niti zdarma. A nit bazénu poskytované jazyka je velmi pravděpodobné, že bude silnější, účinnější a méně kočárek než cokoliv se vrátit k sobě.

Thread t = new Thread(new ThreadStart(DoSomething));  
t.Start();  
t.Join();  

Doufám, že by za normálních okolností mít nějaké další kód mezi Start()a Join(). V opačném případě se další vlákno je k ničemu, a vy plýtvání zdroji bezdůvodně.

Lidé jsou příliš bojí prostředků používaných nití. Nikdy jsem neviděl vytvoření a spuštění vlákno trvat déle než milisekundu. Neexistuje žádný pevný limit na počet vláken, které můžete vytvořit. Využití RAM je minimální. Jakmile budete mít několik set nití, CPU se stává problémem, protože přepínání kontextu, takže v tomto bodě budete chtít dostat fantazie se svým designem.

Milisekundu je dlouhá doba na moderní hardware. To je 3 miliony cyklů na 3GHz stroji. A opět, nejste jediný, kdo vytváří závity. Vaše závity soutěžit o CPU spolu s nití každý druhý programu. Používáte-li ne zcela příliš mnoho vlákna, a tak se jiný program, pak společně jste použili příliš mnoho závitů.

Vážně, nedělají život složitější, než to musí být. Nepoužívejte vlákno bazénu, pokud budete potřebovat něco velmi specifického, které nabízí.

Vskutku. Nedělají život složitější. Pokud váš program potřebuje více pracovních podprocesů, nemusí znovu vynalézat kolo. Použijte vlákno bazén. To je důvod, proč je to tam. Chcete vytvořit vlastní řetězec třídu?

Odpovězeno 13/08/2008 v 22:05
zdroj uživatelem

hlasů
16

Jediným důvodem, proč jsem nechtěl používat ThreadPoollevnou multithreading je, když potřebuji ...

  1. interract s metodou chodu (např zabít to)
  2. spustit kód na podproces STA (to se mi stalo)
  3. udržet nit živý po mé žádosti zemřel ( ThreadPoolzávity jsou na pozadí nitě)
  4. v případě, že musím změnit prioritu závitu. Nemůžeme měnit prioritu nití ThreadPool která je ve výchozím nastavení Normal.

PS: Tento článek MSDN „Managed Thread Pool“ obsahuje oddíl s názvem „Kdy nepoužít Thread Pool příze“ , s velmi podobným, ale o něco více kompletní seznam možných důvodů nepoužívá vlákno bazén.

Existuje spousta důvodů, proč byste museli přeskočit ThreadPool, ale pokud je neznáte, pak ThreadPoolby mělo být dost dobré i pro vás.

Alternativně, podívejte se na nový rámec Paralelní rozšíření , která má nějaké úhledné věci tam, které mohou vyhovovat vašim potřebám, aniž by museli používat ThreadPool.

Odpovězeno 13/08/2008 v 20:32
zdroj uživatelem

hlasů
8

Závit bazény smysl, když máte představu o pracovních vláken. Kdykoli můžete snadno rozdělit zpracování do menších pracovních míst, z nichž každá může být zpracována samostatně, pracovních vláken (a tedy pool závit) smysl.

Závit bazény nemají smysl, když potřebujete vlákno, které vykonávají zcela odlišné a nesouvisejících akcí, které nemohou být považovány za „pracovní místa“; například jeden závit pro GUI zpracování událostí, další pro zpracování backend. Závit bazény také nemají smysl, pokud zpracování tvoří potrubí.

Zjednodušeně řečeno, pokud máte téma, které začínají, procesní práci, a skončit, závit pool je pravděpodobně způsob, jak jít. V opačném případě se nit bazén je opravdu nepomůže.

Odpovězeno 13/08/2008 v 20:32
zdroj uživatelem

hlasů
7

Do hádavý odpověď, chtěl bych dodat, že to je nejlepší nepoužívat ThreadPool vlákno, pokud je třeba zajistit, aby vaše vlákno začne okamžitě pracovat. Maximální počet běžících nití nit-sloučí je omezen za AppDomain, takže vaše dílo může muset počkat, jestli jsou všichni zaneprázdněni. Říká se tomu „fronta uživatel pracovní položka“, po tom všem.

Dvě námitky, samozřejmě:

  1. Můžete změnit maximální počet vláken vláknitých sdruženy v kódu za běhu, takže není nic, co by vás zastavit kontrolu aktuální vs maximálním počtu a upping maximum v případě potřeby.
  2. Roztáčí nové vlákno má vlastní časový trest - ať už je to užitečné pro vás, aby se hitem, závisí na okolnostech.
Odpovězeno 13/08/2008 v 20:34
zdroj uživatelem

hlasů
2

Nemluvím jako někdo s pouze teoretické znalosti zde. Píšu a udržení vysoké aplikací hlasitosti, které dělají těžké použití multithreading, a já většinou nenajdete vlákno bazén být správná odpověď.

Ah argument od autority - ale vždy na pozor na lidi, kteří by mohli mít na jádra týmu Windows.

Ani jeden z nás se dohadovat s tím, že pokud máte nějaké specifické požadavky, pak .NET ThreadPool nemusí být to pravé. Co jsme námitky proti je zlehčování nákladů na stroji vytvořit vlákno.

Značné náklady vytvoření závitu na opodstatnění pro ThreadPool na prvním místě. Nechci, aby moje stroje, které mají být naplněny kód napsaný lidmi, kteří byli špatně informováni o úkor vytváření závitu, a nemají, například víme, že to způsobuje metoda se nazývá v každé DLL, která je připojené k postupu (některé z nich bude vytvořena 3. stran), a které mohou dobře hot-up zatížení kódu, který nemusí být v paměti RAM vůbec a téměř jistě nemusel být v L1.

Tvar hierarchie paměti v moderním stroji znamená, že ‚rušivé‘ CPU je asi to nejhorší, co můžete případně udělat, a každý, kdo se stará o jejich plavidla by měla tvrdě pracovat, aby se jí vyhnuli.

Odpovězeno 13/08/2008 v 23:08
zdroj uživatelem

hlasů
1

Když se chystáte provést operaci, která je bude trvat dlouhou dobu, nebo možná kontinuální pozadí nit. Dalo by se vždy tlačit množství nití jsou k dispozici v bazénu až do, ale tam by byl smysl vynaložení nákladů na správu na vlásku, který se nikdy dostat zpět do bazénu.

Odpovězeno 13/08/2008 v 20:27
zdroj uživatelem

hlasů
0

Threadpool nitě jsou vhodné pro úkoly, které splňují obě následující kritéria:

  1. Úkol nebude muset trávit hodně času čekání na něco, co se stane,
  2. Cokoli, co je čeká úkol dokončit budou pravděpodobně čekat na mnoho úkolů dokončit, takže jeho plánovací priorita není apt ovlivnit věci hodně.

Použití threadpool vlákno namísto vytváření nové ušetří významné, ale ohraničenou dobu. Pokud je významné, že doba ve srovnání s dobou to bude trvat, aby provedl nějaký úkol, úkol threadpool je pravděpodobné, že je to vhodné. Čím delší je doba potřebná k provedení úkolu, nicméně, tím menší je výhoda použití threadpool a tím větší je pravděpodobnost účinnosti threadpool úkolu brání.

Odpovězeno 30/04/2013 v 21:57
zdroj uživatelem

hlasů
0

MSDN má seznam nějakých důvodů se zde:

http://msdn.microsoft.com/en-us/library/0ka9477y.aspx

Existuje několik scénářů, ve kterých je vhodné vytvářet a spravovat své vlastní téma namísto použití nití bazén závity:

  • Budete potřebovat nit popředí.
  • Budete potřebovat nit mít zvláštní prioritu.
  • Máte úkoly, které způsobují nit zablokovat po dlouhou dobu. Nit bazénu má maximální počet vláken, takže velký počet blokovaných bazénu závitů závitových mohou zabránit úloh spuštění.
  • Je třeba umístit závity do jednoho podprocesem apartment. Všechny ThreadPool závity jsou ve vícevláknových bytě.
  • Musíte mít stabilní identitu spojenou s nití, nebo se věnovat vlákno k úkolu.
Odpovězeno 13/08/2012 v 05:45
zdroj uživatelem

hlasů
-1

@Eric

@Derek, nemám přesně souhlasit se scénářem, který používáte jako příklad. Pokud si nevíte, co přesně se běží na počítači, a přesně to, kolik celkem nitě, kliky, čas CPU, RAM, atd, že vaše aplikace bude používat v rámci určité množství nákladu, jste v průšvihu.

Vy jste jediný cílový zákazník pro programy, které píšete? Pokud tomu tak není, nemůžete být jisti, o většinu z toho. Budete obecně mají ponětí, kdy napíšete program, zda se bude spouštět efektivně sólo, nebo v případě, že poběží na webovém serveru je vyraženo o DDOS útoku. Nemůžete vědět, kolik CPU času budete mít.

Za předpokladu, že změny chování vašeho programu založený na vstupu, to je vzácné ani přesně vědět, kolik paměti nebo CPU čas bude váš program konzumovat. Jistě, měli byste mít docela dobrou představu o tom, jak se váš program bude chovat, ale většina programů nejsou nikdy analyzovány přesně určit, kolik paměti kolik kliky, atd. Budou použity, protože úplná analýza je drahé. Pokud nejste psaní real-time software, odměna za to nestojí za námahu.

Obecně platí, že tvrdil, že přesně vědět, jak váš program bude chovat je přitažené za vlasy, a tvrdí, že ví všechno o stroj blíží k smíchu.

A abych byl upřímný, pokud nevíte přesně, jakou metodu byste měli použít: manuální závity, závit bazén, delegátů, a jak implementovat to dělat jen to, co vaše aplikace potřebuje, jste v průšvihu.

Nemám úplně nesouhlasím, ale nemám opravdu vidět, jak je to důležité. Tato stránka je zde specificky protože programátoři nemají vždy všechny odpovědi.

Pokud vaše aplikace je dost složité vyžadovat škrcením počet vláken, které používáte, nejsou téměř vždy bude chtít větší kontrolu než to, co rámcová dává?

Ne. Pokud je potřeba bazén vlákno, budu používat ten, který za předpokladu, dokud jsem zjistil, že to není dostačující. Nebudu jen předpokládat, že za předpokladu, závit bazén je nedostačující pro mé potřeby bez potvrzení, že tomu tak je.

Nemluvím jako někdo s pouze teoretické znalosti zde. Píšu a udržení vysoké aplikací hlasitosti, které dělají těžké použití multithreading, a já většinou nenajdete vlákno bazén být správná odpověď.

Většina mých profesních zkušeností byl s multithreading a multiprocessingu programů. Často jsem potřeboval vrátit své vlastní řešení, jak dobře. To neznamená, že nit pool není užitečné, nebo vhodné v mnoha případech. Nit bazénu je postavena tak, aby zvládnout pracovních podprocesů. V případech, kdy jsou vhodné více pracovních vláken, by za předpokladu, závit pool by obecně měla být první přístup.

Odpovězeno 13/08/2008 v 23:05
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more