Cum s-ar implementa un threadpool? „Am citit pe Wikipedia pentru„ threadpool ”, dar tot nu pot să-mi dau seama ce ar trebui să facem pentru a rezolva această întrebare (probabil pentru că nu am înțeles cu adevărat ce este un threadpool în termeni simpli).
Poate cineva să-mi explice în engleză simplă ce este un threadpool și cum s-ar răspunde la această întrebare?
Răspunde
Un thread pool-ul este un grup de fire pre-instanțiate, inactive, care sunt gata să fie date de lucru. Acestea sunt preferate în locul instanțierii de fire noi pentru fiecare sarcină, atunci când există un număr mare de sarcini scurte de făcut, mai degrabă decât un număr mic de fire lungi. Acest lucru previne nevoia de a suporta cheltuielile generale pentru crearea unui fir de multe ori.
Implementarea va varia în funcție de mediu, dar în termeni simplificați, aveți nevoie de următoarele:
- O modalitate de a crea fire și de a le menține într-o stare inactivă. Acest lucru poate fi realizat prin așteptarea fiecărui fir la o barieră până când pool-ul dă mâna să funcționeze. (Acest lucru se poate face cu mutexes De asemenea.)
- Un container pentru stocarea firelor create, cum ar fi o coadă sau orice altă structură care are un mod de a adăuga un fir la piscină și de a-l extrage.
- O interfață standard sau o clasă abstractă pentru thread-urile pe care să le folosească la efectuarea muncii. Aceasta ar putea fi o clasă abstractă numită
Task
cu o metodăexecute()
care face lucrarea și apoi revine.
Când se creează grupul de fire, acesta va crea fie un anumit număr de fire pentru a le pune la dispoziție, fie va crea altele noi în funcție de necesitățile implementării.
Când grupului i se înmânează un Task
, ia un fir din container (sau așteaptă ca unul să devină disponibil dacă containerul este gol), îi dă un Task
, și întâlnește bariera. Acest lucru face ca firul inactiv să reia executarea, invocând metoda execute()
a Task
care a fost dată. Odată ce execuția este finalizată, firul se întoarce înapoi la piscină pentru a fi introdus în container pentru reutilizare și apoi întâlnește bariera acestuia, adormindu-se până când ciclul se repetă.
Comentarii
- Un pool de fire este un grup de fire pre-instanțiate, inactive, care sunt gata să li se dea de lucru. […] Acest lucru previne nevoia de a suporta cheltuielile generale pentru crearea unui fir de mai multe ori. – acest lucru ar trebui să fie scuipat de Google ori de câte ori cineva caută un fir ” pool ”
- Creația thread pool implică barieră internă? Puteți distribui referințe, pe aceste linii?
- @overexchange Nu, nu. Referința mea la această întrebare a fost un exemplu de mod mai bun de a scrie din nou întrebarea dvs. de barieră . (Dacă da, voi scrie un răspuns.)
- unul dintre cele mai bune răspunsuri scurte.
Răspuns
Pool de fire este o colecție de fire gestionate organizate de obicei într-o coadă, care execută sarcinile din coada de activități.
Crearea unui nou obiect subiect de fiecare dată când aveți nevoie de ceva pentru a fi executat în mod asincron este costisitoare. Într-un pool de fire, ați adăuga sarcinile pe care doriți să le executați asincron la coada de sarcini, iar pool-ul de fire se ocupă de atribuirea unui thread disponibil, dacă există, pentru sarcina corespunzătoare. De îndată ce sarcina este finalizată, firul acum disponibil solicită o altă sarcină (presupunând că a mai rămas).
Grupul de fire vă ajută să evitați crearea sau distrugerea mai multor fire, decât ar fi cu adevărat necesar.
Aș începe prin crearea unei clase cu o coadă de fire și o coadă de sarcini. Apoi implementați o metodă care adaugă o sarcină la coada de sarcini și treceți de acolo. Evident, ar trebui să faceți posibilă setarea firelor maxime permise într-un pool de fire.
Răspuns
Exemplu de viață reală;
- Facilitate: sistem de operare
- Secțiuni: Aplicații
- Persoane: fire
Aveți o facilitate acolo 12 persoane lucrează. Există 3 secțiuni ale acestei facilități. Bucătărie, toalete și securitate. Dacă nu utilizați tehnica pool-ului de fire, așa funcționează: toate cele 12 persoane vor sta în picioare într-o sală de ședințe, dacă clienții noi vin prin facilități și cer sarcini, atunci veți separa oamenii în grupuri și îi veți trimite să facă munca lor și să se întoarcă în sala de ședințe. Dar, înainte de a pleca la datoria lor, există o etapă de pregătire. Ei trebuie să poarte uniforma corectă, să echipeze anumite dispozitive și să meargă la acea secțiune, să termine lucrările și să revină de fiecare dată când își termină treaba (firul se termină), trebuie să se întoarcă în sala de ședințe, să se dezbrace uniform, să scoată echipament și să aștepte următoarea lucrare. Acestea se referă la crearea contextului firului, alocarea memoriei și informațiile de urmărire de către sistemul de operare.Este nevoie de prea mult timp pentru ca sistemul de operare să reorganizeze noile nevoi de fire.
Dacă utilizați gruparea de fire, atunci, dimineața devreme, veți repartiza 6 persoane la bucătărie, 2 persoane la toaletă și 4 persoane la securitate. Deci, își vor face pregătirea doar o dată pe zi. Chiar dacă nu există clienți la bucătărie, acele 4 persoane vor fi acolo, la ralanti, pentru orice sarcini viitoare. Nu trebuie să se întoarcă în sala de ședințe până când bucătăria nu se închide (aplicația se termină). Aceste 4 persoane se află în piscina aplicației Kitchen și sunt gata să servească rapid. Dar nu puteți promite că lucrează toată ziua, deoarece bucătăria poate deveni din când în când inactivă. Aceeași logică se aplică și pentru toalete și securitate.
În primul scenariu, nu pierdeți niciun fir pentru nicio activitate, DAR va dura mult timp pentru a pregăti fiecare fir pentru fiecare activitate. În al doilea rând, pregătiți thread-urile în avans, deci nu puteți garanta că veți utiliza toate thread-urile pentru toate sarcinile, dar sistemul de operare face în mare parte o optimizare excelentă, așa că vă puteți baza în siguranță pe el.
Răspuns
În aplicația cu mai multe fire, grupul de fire este un „grup de fire disponibile” care poate fi utilizat de aplicația dvs. De obicei, de ex. .NET, totul este gestionat, astfel încât să atribuiți sarcini și, odată ce un fir este liber, îl va efectua. Deci, pentru a implementa un grup de fire, m-aș aștepta să creez un concept în care sarcinile sunt preluate automat de fire gratuite, fără crearea de fire explicite pentru fiecare activitate.