Kas yra siūlų baseinas? Kodėl verta naudoti siūlų baseinus? Kaip naudoti siūlų baseinus?
1. Kas yra siūlų baseinas?
.NET Framework ThreadPool klasė suteikia gijų telkinį, kurį galima naudoti užduotims vykdyti, darbo elementams siųsti, asinchroniniams I/O tvarkyti, laukti kitų gijų vardu ir tvarkyti laikmačius. Taigi, kas yra siūlų baseinas? Gijų telkinys iš tikrųjų yra "telkinys", kuriame saugomi gijų objektai, ir jame pateikiami keli pagrindiniai metodai, pvz., minimalaus/maksimalaus gijų skaičiaus telkinyje nustatymas, vykdytinų metodų eilė ir kt. "ThreadPool" yra statinė klasė, todėl ją galima naudoti tiesiogiai, nekuriant objektų.
2. Kodėl verta naudoti siūlų baseinus? Kokia nauda?
Oficialioje "Microsoft" svetainėje sakoma: Daugelis programų sukuria daugybę miego gijų, laukiančių, kol įvyks įvykiai. Taip pat yra daug gijų, kurios gali pereiti į užmigdymo režimą, kad periodiškai pabustų ir apklaustų pasikeitusią ar atnaujintą būsenos informaciją. Gijų telkiniai, leidžiantys efektyviau naudoti gijas per sistemos valdomų darbininkų gijų telkinį.
Paprasčiau tariant, kiekviena nauja gija turi užimti atminties vietą ir kitus išteklius, o turint tiek daug naujų gijų, daugelis jų neveikia arba laukia, kol ištekliai bus išleisti. Yra daug gijų, kurios periodiškai atlieka tik nedidelį darbą, pvz., atnaujina duomenis ir pan., kurios yra pernelyg švaistomos, ir retai kada daug gijų išsiveržia programuojant ir baigiasi per trumpą laiką. Todėl buvo pasiūlyta siūlų baseinų koncepcija. Jei programa pateikia kitą užklausą gijų telkiniui, laukianti gija suaktyvinama ir vykdo užduotį nesukurdama naujos gijos, o tai sutaupo daug papildomų išlaidų. Sistema automatiškai sunaikins siūlus tik tada, kai gijų skaičius pasieks maksimalų gijų skaičių. Todėl naudojant gijų telkinius galima išvengti didelių kūrimo ir sunaikinimo išlaidų, geresnio našumo ir stabilumo, antra, kūrėjai gali sutelkti dėmesį į kitas užduotis, perduodami gijas sistemos valdymui.
3. Kaip naudoti siūlų fondus?
Tiesą sakant, siūlų baseinus naudoti labai paprasta
a. Nustatykite didžiausią ir mažiausią gijų telkinį:
ThreadPool.SetMaxThreads (int workerThreads,int completionPortThreads) Nustatykite vienu metu aktyvių gijų telkinio užklausų skaičių. Visos užklausos, didesnės už šį skaičių, liks eilėje, kol bus prieinama gijų telkinio gija. Taip pat galite nustatyti minimalų siūlų skaičių.
b. Įtraukite užduotis į gijų telkinį:
ThreadPool.QueueUserWorkItem(naujas WaitCallback(metodo pavadinimas));
arba ThreadPool.QueueUserWorkItem(naujas WaitCallback(metodo pavadinimas), parametras);
Pavyzdžiui, jei ne daugiau kaip 5 gijų telkinyje metodas vykdomas 60 kartų, bendras atlyginimas per 5 metus yra toks:
Jei nenaudojate gijų telkimo, gali tekti atidaryti 60 gijų, kad asinchroniškai vykdytumėte Run() metodą, o tai yra vietos išteklių švaistymas. Dabar naudojame iki 5 gijų, kurias galima įvykdyti per 1 sekundę, o efektyvumas ir našumas yra labai geri.
|