Vra

Wat is die verskil tussen die gebruik van'n nuwe draad en met behulp van'n draad van die draad swembad?Wat prestasie voordele is daar en hoekom moet ek oorweeg die gebruik van'n draad uit die swembad eerder as een wat ek het uitdruklik geskep?Ek dink spesifiek van .NET hier nie, maar algemene voorbeelde is fyn.

Was dit nuttig?

Oplossing

Draad swembad sal voorsien voordele vir gereelde en relatief kort bedrywighede deur

  • Die hergebruik van drade wat reeds geskep het in plaas van die skep van nuwes ('n duur proses)
  • Wurgend die koers van die draad skepping wanneer daar'n sarsie van versoeke vir nuwe werk items (ek glo dit is net in .NET 3.5)

    • As jy ry 100 draad swembad take, sal dit net gebruik as baie drade soos reeds geskep is om diens hierdie versoeke (10 sê vir voorbeeld).Die draad swembad sal maak gereelde kontrole (ek glo elke 500ms in 3.5 SP1) en as daar is tougestaan take, sal dit maak'n nuwe draad.As jou take is vinnig, dan is die aantal nuwe drade sal klein wees en die hergebruik van die 10 of so drade vir die kort take sal wees vinniger as die skep van 100 drade aan die voorkant.

    • As jou werklading konsekwent het groot getalle van die draad swembad versoeke kom in, dan die draad swembad sal inskakel homself aan jou werklading deur die skep van meer drade in die swembad deur die bogenoemde proses so dat daar'n groter aantal van die draad beskikbaar is om die proses versoeke

    • kyk Hier vir meer in diepte inligting oor hoe die draad swembad funksies onder die enjinkap

Die skep van'n nuwe draad jouself sou meer gepas as die werk gaan wees relatief lang loop (waarskynlik rondom'n sekonde of twee, maar dit hang af van die spesifieke situasie)

@Krzysztof - Draad Swembad drade agtergrond drade wat sal stop wanneer die belangrikste draad eindig.Met die hand geskep drade is voorgrond by verstek (sal hou hardloop na die belangrikste draad geëindig het), maar kan ingestel word om die agtergrond voor die roeping Begin op hulle.

Ander wenke

Die .NETTO daarin geslaag threadpool:-

  • Groottes self gebaseer op die huidige werklading en beskikbare hardeware
  • Bevat werker drade en voltooiing hawe drade (wat spesifiek gebruik word om te diens IO)
  • Is geskik vir'n groot aantal van die relatief van korte duur operasies

Ander draad swembad implementering bestaan wat dalk meer gepas vir'n lang-lopende bedrywighede.

Spesifiek, gebruik'n draad swembad om te verhoed dat jou app van die skep van te veel drade.Die belangrikste kenmerk van'n threadpool is die werk tou.Dit is, sodra jou rekenaar is voldoende besig, die threadpool sal tou op versoeke eerder as om onmiddellik kuit meer drade.

So, as jy sal'n klein, begrens aantal van die drade skep hulle self.As jy nie kan bepaal up-front hoeveel drade geskep kan word (bv.hulle is geskep in reaksie op inkomende IO), en hul werk sal van korte duur wees, gebruik die threadpool.As jy nie weet hoe baie, maar hul werk sal wees om lang-lopende, daar is niks in die platform om jou te help - maar jy kan in staat wees om te vind alternatiewe threadpool implementering wat pas.

ook

  

new Thread().Start()

toegevoeg Voorgrond draad wat nie sal sterf as jy jou program te sluit. ThreadPool drade is agtergrond drade wat sterf wanneer jy die app sluit.

Ek was aandenkings oor die relatiewe hulpbrongebruik vir hierdie en en hardloop 'n maatstaf op my 2012 dual-core Intel i5 laptop met behulp van net 4,0 release bou op vensters 8. onderwerp Pools het gemiddeld 0.035ms om te begin waar Threads het 'n gemiddelde van 5.06ms. Met ander woorde Thread in die swembad begin oor 300x vinniger vir 'n groot aantal van korte duur drade. Ten minste in die toets reeks (100-2000) drade, die totale tyd per draad gelyk mooi konstante.

Dit is die kode wat vergelyk word:

    for (int i = 0; i < ThreadCount; i++) {
        Task.Run(() => { });
    }

    for (int i = 0; i < ThreadCount; i++) {
        var t = new Thread(() => { });
        t.Start();
    }

 betree beeld beskrywing hier

Gaan hier vir 'n vorige draad:

Wanneer moet ek nie die ThreadPool in Net gebruik?

Opsomming is dat Threadpool is goed as wat jy nodig het om kuit baie korte duur drade, terwyl die gebruik van Threads gee jou 'n bietjie meer beheer.

Thread plaaslike stoor is nie 'n goeie idee met draad poele. Dit gee drade 'n "identiteit"; nie alle gesprekke is meer gelyk. Nou draad swembaddens is veral nuttig as jy net 'n klomp van identiese drade, gereed om jou werk te doen sonder die skepping oorhoofse nodig.

As jy 'n klomp drade nodig, waarskynlik wil hê jy moet 'n ThreadPool gebruik. Hulle hergebruik drade spaar jy die oorhoofse van draad skepping.

As jy net een draad nodig het om iets gedoen te kry, onderwerp is waarskynlik die maklikste.

Die primêre behoefte aan theadpool drade is om kort bietjie take wat na verwagting byna dadelik voltooi hanteer. Hardeware onderbreking hanteerders loop dikwels in 'n stapel konteks wat nie geskik is vir nie-kern-kode sal wees, maar 'n hardeware onderbreking hanteerder kan ontdek dat 'n gebruiker-mode I / O voltooiing terugbel so gou as moontlik moet uitgevoer word. Die skep van 'n nuwe draad vir die doel van die bestuur van so 'n ding sou massiewe overkill wees. Na 'n paar pre-geskape drade wat kan gestuur word na I / O voltooiing verifikasie of ander soortgelyke dinge uit te voer is baie meer doeltreffend te maak.

'n Sleutelaspek van sulke drade is dat as I / O voltooiing metodes te voltooi altyd in wese oombliklik en nooit te sluit, en die getal van sodanige gesprekke wat tans sulke metodes loop ten minste gelyk is aan die aantal verwerkers, die enigste manier enige ander draad kan voor een van die bogenoemde metodes hardloop afwerkings sou wees as een van die ander metodes blokke of die uitvoering daarvan keer dat 'n normale threading time-sny oorskry; nie een van dié moet baie dikwels gebeur as die draad swembad gebruik soos bedoel.

As 'n metode kan nie verwag om af te sluit binne 100ms of so van wanneer dit begin uitvoer, die metode moet uitgevoer word via 'n ander as die vernaamste draad swembad middel. As 'n mens 'n baie take uit te voer wat CPU intensiewe is maar sal nie blok, kan dit nuttig wees om hulle te stuur met behulp van 'n poel van toepassing drade (een per CPU kern) wat apart van die "hoof" threadpool, aangesien die gebruik van meer drade as cores sal teenproduktief wees wanneer hy hardloop nie-blokkeer CPU-intensiewe take. As jy egter 'n metode sal 'n tweede of langer uit te voer te neem, en sal die meeste van sy tyd geblokkeer spandeer, moet die metode waarskynlik hardloop in 'n toegewyde draad, en moet byna seker nie uitgevoer word in 'n hoof-threadpool draad. As 'n lang-lopende operasie moet veroorsaak word deur iets soos 'n I / O terugbel, moet 'n mens óf begin 'n draad vir die lang-lopende operasie in die opmars van die callback en het dit wag op 'n monitor wat die callback polse, of anders het die callback bekendstelling van 'n nuwe draad na die operasie uit te voer terwyl die callback uitgange, effektief sy eie draad terug te keer na die threadpool.

In die algemeen (Ek het nog nooit gebruik NET), sou 'n draad swembad gebruik word vir hulpbronbestuur doeleindes. Dit laat beperkinge word ingestel in jou sagteware. Dit kan ook gedoen word vir prestasie redes, soos die skepping van nuwe drade duur kan wees.

Daar kan ook stelsel spesifieke redes. In Java (weer Ek weet nie of dit geld vir NET), die bestuurder van die drade kan draad spesifieke veranderlikes toe te pas as elke draad word getrek uit die swembad, en ontstel hulle wanneer hulle teruggekeer (algemene manier om so iets te slaag 'n identiteit).

Voorbeeld beperking: Ek het net 10 db verbindings, so ek sal net toelaat dat 10 werkers drade vir toegang tot die databasis.

Dit beteken nie dat jy nie moet skep jou eie drade, maar daar is omstandighede waaronder dit sinvol om 'n swembad gebruik.

Die gebruik van 'n swembad is 'n goeie idee, as jy nie weet of kan nie beheer hoeveel draad geskep sal word.

Net 'n probleem met 'n vorm met behulp van draad tot 'n veld van 'n databasis op te dateer op 'n positionchanged geval van 'n lys beheer (vermy freez). Dit het 5 minute vir my gebruiker om 'n fout van die databasis (te veel Connexion met Access) het, want hy was die verandering van die lys posisie te vinnig ...

Ek weet daar is ander manier om die basis probleem (insluitend nie die gebruik van toegang) maar pooling is 'n goeie begin op te los.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top