Programmēšana

Izpratne par pavedienu kopām C #

Vītne ir mazākā izpildes vienība procesā. Vītņu kopa sastāv no vairākiem pavedieniem vai, precīzāk sakot, pavedienu kolekcijas, un to var izmantot, lai fonā veiktu vairākas darbības.

Kāpēc man vajadzētu izmantot pavedienu baseinus?

Vītnes ir dārgas, jo tās patērē daudz resursu jūsu sistēmā, lai inicializētu, pārslēgtu kontekstus un atbrīvotu to aizņemtos resursus. Parasti, kad pavediens veic I / O darbību (failu apstrāde, datu bāzes darbība vai piekļuve tīkla resursiem utt.), Operētājsistēma bloķē pavedienu, līdz I / O darbība ir pabeigta. Vītne atsāks CPU darbību pēc tam, kad būs pabeigta I / O darbība.

Vītņu kopa ir laba izvēle, ja vēlaties ierobežot pavedienu skaitu, kas darbojas noteiktā laika posmā, un vēlaties izvairīties no papildu izdevumiem, veidojot un iznīcinot pavedienus savā lietojumprogrammā. Tā ir arī laba izvēle, ja lietojumprogrammā ir daudz uzdevumu, kas jāveic vienlaicīgi vai vienlaikus, un vēlaties uzlabot lietojumprogrammas atsaucību, izvairoties no konteksta pārslēgšanas. Lai izveidotu pavedienu kopu, varat izmantot System.Threading.ThreadPool klases priekšrocības.

Šis koda fragments parāda, kā jūs varat iestatīt minimālo pavedienu skaitu pavedienu pūlā.

ThreadPool.SetMinThreads (50, 50);

Tomēr ņemiet vērā, ka, ja tiek izpildīts ilgstošs uzdevums, pavedienu kopas pavediens var būt bloķēts uz ilgu laiku. Vēl sliktāk ir tas, ka ienākošie pieprasījumi, kas ir atkarīgi no pavedienu kopas pavedieniem, var būt aizturēti vai pat noraidīti galvenokārt tāpēc, ka pavedienu kopā var nebūt pieejamu pavedienu ienākošā pieprasījuma apstrādei. Vītņu kopa arī nav laba izvēle, ja jums ir pavedieni, kas atšķiras pēc prioritātēm, vai jums var būt nepieciešams priekšlaicīgi pārtraukt pavedienu. Priekšlaicīga pavediena pārtraukšana nozīmē, ka pavediens ir stingri apturēts, pirms ir pagājis tā apgriezienu laiks.

Kā darbojas vītņu baseins?

Būtībā, strādājot ar pavedienu kopām, parasti pirms pavedienu izmantošanas lietojumprogrammā izveidojat pavedienu kolekciju un uzglabājat tos pavedienu kopā. Kad un kad jums ir nepieciešams pavediens, jūs tos atkārtoti izmantojat, nevis izveidojat jaunus pavedienus katru reizi, kad lietojumprogrammai ir jāizmanto pavediens.

Tātad, lietojumprogramma pieprasīs pavedienu kopai iegūt pavedienu no tā, veikt darbības, izmantojot pavedienu, un pēc tam atgriezīs pavedienu atpakaļ pavedienu kopā. Vītņu kopas ir noderīgas situācijās, kad jums ir jāizpilda vairāk uzdevumu, nekā jūs varat izveidot pavedienus (ir ierobežots maksimālais katrā procesā izveidojamo pavedienu skaits).

Kā es varu optimizēt pavedienu kopu?

Kad process sākas, CLR tam piešķir pavedienu kopu. Ņemiet vērā, ka, ja nepieciešams, varat konfigurēt pavedienu kopas lielumu. Izpildlaiks gudri pārvalda pavedienu kopu. Sākot pavedienu kopu, pavedienu baseinā ir tikai viens pavediens. Kopš tā laika pavedienu kopas pārvaldnieks (komponents, kas atbildīgs par pavedienu kopas pārvaldīšanu) izveido vairāk pavedienu un saglabā tos pavedienu kopā, palielinoties lietojumprogrammas slodzei, t.i., lietojumprogrammai ir nepieciešams veikt vairāk un vairāk uzdevumu, kas jāveic vienlaikus.

Vītņu skaitu, kas jebkurā brīdī var būt pieejams pavedienu kopā, nosaka maksimālais pieļaujamais pavedienu ierobežojums pavedienu kopā. Citiem vārdiem sakot, pieejamo pavedienu skaits pavedienu krājumā laiku pa laikam atšķiras atkarībā no lietojuma pavedienu patēriņa. Tiklīdz tiek sasniegts maksimālais ierobežojums (maksimālais pavedienu skaits pavedienu pūlā), programma daudz retāk izveido jaunus pavedienus.

Vajadzības gadījumā jūs vienmēr pats varat iestatīt pieļaujamo diegu augšējo robežu diegu kopā. Lai to izdarītu, jums vajadzētu izmantot rekvizīta ThreadPool.SetMaxThreads priekšrocības. Lai iestatītu pavedienu pūla apakšējo robežu, varat izmantot rekvizītu ThreadPool.SetMinThreads. Noklusējuma pavedienu skaita apakšējā ierobežojums pavedienu pūlā ir viens pavediens uz vienu procesoru.