Junior — Middle
Kaip galima kontroliuoti aktyvių srautų skaičių programoje?
sobes.tech AI
Atsakymas iš AI
Go kalboje dažniausiai aktyvių srautų (gorutinų) skaičių kontroliuojama naudojant sinchronizacijos ir paralelizmo ribojimo mechanizmus:
-
Buferiniai kanalai kaip semaforai: sukuria kanalą su ribotu talpumu ir prieš pradedant gorutiną į jį siunčia reikšmę, o pasibaigus – priima ją, taip ribodami vienu metu veikiančių gorutinų skaičių.
-
sync.WaitGrouppaketas: padeda laukti, kol gorutinų grupė baigsis, bet jų skaičiaus neriboja. -
golang.org/x/sync/semaphorepaketas: siūlo patogų semaforą paralelizmui riboti.
Pavyzdys naudojant semaforo kanalą:
sem := make(chan struct{}, 5) // maksimaliai 5 gorutinų vienu metu
for _, task := range tasks {
sem <- struct{}{} // blokuoja, jei jau yra 5 gorutinai
go func(t Task) {
defer func() { <-sem }() // atlaisvina vietą
process(t)
}(task)
}
// Laukiame, kol visi gorutinai baigsis
for i := 0; i < cap(sem); i++ {
sem <- struct{}{}
}
Šiuo būdu galima kontroliuoti aktyvių srautų skaičių ir išvengti išteklių perteklinio naudojimo.