Sobes.tech
Junior — Middle

Kas on võimalik seada piir ühe programmi korraga käivitatavate goroutine'ide arvule?

sobes.tech AI

Vastus AI-lt

Go keeles ei ole sisseehitatud mehhanismi, mis rangelt piiraks samaaegselt käivitunud gorutinite arvu. Võib olla väga palju gorutine, ning nende planeerimine ja vahetus toimub Go jooksutööaja poolt.

Kui aga soovite piirata samaaegselt töötavate gorutinite arvu (näiteks ressursside kasutamise kontrollimiseks), saate kasutada semafore või kanaleid paralleelsuse piiramiseks.

Näide, kuidas piirata samaaegselt töötavate gorutinite arvu kanali abil:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // ressursi hankimine
    fmt.Printf("Gorutina %d alustas tööd\n", id)
    // ... töö ...
    fmt.Printf("Gorutina %d lõpetas töö\n", id)
    <-sem // ressursi vabastamine
}

func main() {
    const maxGoroutines = 5
    sem := make(chan struct{}, maxGoroutines)
    var wg sync.WaitGroup

    for i := 0; i < 20; i++ {
        wg.Add(1)
        go worker(i, sem, &wg)
    }

    wg.Wait()
}

Selles näites ei tööta rohkem kui 5 gorutinit samaaegselt.