Mis on niidipool? Miks kasutada niidibasseine? Kuidas kasutada niidi poole?
1. Mis on niidikogu?
.NET raamistiku ThreadPool klass pakub lõimede basseini, mida saab kasutada ülesannete täitmiseks, tööülesannete saatmiseks, asünkroonse I/O haldamiseks, teiste lõimede nimel ootamiseks ja taimerite käsitlemiseks. Mis siis on niidipool? Lõimede pooli on tegelikult "bassein", mis salvestab lõimeobjektid ning pakub mõningaid põhimeetodeid, näiteks minimaalse/maksimaalse lõimede arvu määramist basseinis, käivitatavate meetodite järjekorda panemist jne. ThreadPool on staatiline klass, seega saab seda kasutada otse ilma objekte loomata.
2. Miks kasutada niidikogusid? Millised on selle eelised?
Microsofti ametlik veebileht ütleb järgmist: Paljud rakendused loovad suure hulga lõime, mis on unes ja ootavad sündmuste toimumist. On ka palju teemasid, mis võivad minna talveunne, et aeg-ajalt ärgata ja küsida muudetud või uuendatud osariigi infot. Lõimede basseinid, mis võimaldavad lõime tõhusamalt kasutada süsteemi hallatavate töölõimede kaudu.
Lihtsalt öeldes peab iga uus lõim hõivama mäluruumi ja muid ressursse ning nii paljude uute lõimede tõttu on paljud neist uinunud või ootavad ressursside vabastamist. On palju lõime, mis teevad perioodiliselt vaid väikest tööd, näiteks andmete värskendamine jne, mis on liiga raiskav joonistada, ning harva juhtub, et päris programmeerimises tekib suur hulk lõime ja lõpeb lühikese ajaga. Seetõttu pakuti välja lõimebasseinide kontseptsioon. Kui rakendus teeb lõimepoolile uue päringu, aktiveeritakse ootel olekus olev lõim ja see käivitab ülesande ilma uut lõime loomata, mis säästab palju lisakoormust. Süsteem hävitab lõimed automaatselt alles siis, kui lõimede arv jõuab maksimaalse lõimede arvuni. Seetõttu aitab lõimede poolide kasutamine vältida suuri loomise ja hävitamise kulusid, pakkuda paremat jõudlust ja stabiilsust ning teiseks saavad arendajad keskenduda teistele ülesannetele, andes lõimed üle süsteemihaldusele.
3. Kuidas ma kasutan niidikogusid?
Tegelikult on niidipoolid väga lihtsad kasutada, nagu järgmised
a. Sea maksimaalne ja minimaalne lõimede hulk:
ThreadPool.SetMaxThreads (int workerThreads, int completionPortThreads) Määra taotluste arv lõimede kogumile, mis võib olla samaaegselt aktiivne. Kõik taotlused, mis on suuremad kui see number, jäävad järjekorda kuni lõimepooli lõim muutub kättesaadavaks. Saad määrata ka minimaalse lõimede arvu.
b. Lisa ülesanded lõimede basseini:
ThreadPool.QueueUserWorkItem(uus WaitCallback(metoodi nimi));
või ThreadPool.QueueUserWorkItem(uus WaitCallback(meetodi nimi), parameeter);
Näiteks, kui maksimaalselt 5 lõime lõime kogus täidab meetodi 60 korda, on 5 aasta kogupalk järgmine:
Kui sa ei kasuta lõimede kogumist, võib juhtuda, et pead avama 60 lõime, et Run() meetodit asünkroonselt käivitada, mis on ruumi raiskamine. Nüüd kasutame kuni 5 lõime, mida saab käivitada ühe sekundiga, ning efektiivsus ja jõudlus on väga head.
|