Sobes.tech
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.WaitGroup paketas: padeda laukti, kol gorutinų grupė baigsis, bet jų skaičiaus neriboja.

  • golang.org/x/sync/semaphore paketas: 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.