Sobes.tech
Junior — Middle

Kā noteikt ierobežojumu vienlaicīgi palaistu goroutine skaitam Go valodā?

sobes.tech AI

Atbilde no AI

Go valodā nav iebūvēta mehānisma tieši ierobežot vienlaikus palaidoto gorutīnu skaitu. Tomēr, lai kontrolētu paralēlismu, parasti izmanto semaforus vai ar ierobežotu kapacitāti kanālus.

Piemērs, kā ierobežot vienlaikus darbojošo gorutīnu skaitu, izmantojot kanālu:

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // aizņem vietu
    fmt.Printf("Goroutine %d sāka darbu\n", id)
    time.Sleep(time.Second) // darba imitācija
    fmt.Printf("Goroutine %d pabeidza darbu\n", id)
    <-sem // atbrīvo vietu
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // kanāls ar buferi, ierobežo gorutīnu skaitu
    var wg sync.WaitGroup

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

Šajā piemērā kanāls sem ar buferi maxGoroutines ierobežo vienlaikus darbojošo gorutīnu skaitu. Katra gorutina, pirms sākt darbu, ievieto tukšu struktūru kanālā, aizņemot vietu, un pēc darba pabeigšanas to atbrīvo. Tādējādi vienlaikus var darboties ne vairāk kā maxGoroutines gorutīnu.