Sobes.tech
Junior — Middle

Vai ir iespējams noteikt limitu vienlaikus darbojošo pavedienu skaitam Go valodā?

sobes.tech AI

Atbilde no AI

Go valodā nav iebūvēta mehānisma tieši ierobežot vienlaikus darbojošo gorutīnu (vieglās pavedienu) skaitu. Var būt ļoti daudz gorutīnu, un tās ir vieglas. Lai ierobežotu vienlaikus darbojošo gorutīnu skaitu, 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{}{} // Rezervēt vietu
    fmt.Printf("Darbinieks %d sāka\n", id)
    time.Sleep(time.Second) // Darbs
    fmt.Printf("Darbinieks %d beidza\n", id)
    <-sem // Atbrīvot vietu
}

func main() {
    const maxConcurrent = 3
    sem := make(chan struct{}, maxConcurrent) // Kanāls ar ierobežojumu
    var wg sync.WaitGroup

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

    wg.Wait()
}

Šeit kanāls sem ar buferi maxConcurrent ierobežo vienlaikus darbojošo gorutīnu skaitu līdz 3.