Sobes.tech
Junior — Middle

Kas on võimalik määrata piir ühe korraga töötavate lõimede arvule Go keeles?

sobes.tech AI

Vastus AI-lt

Go keeles ei ole sisseehitatud mehhanismi otse piirata samaaegselt töötavate gorutinate (kergete lõimede) arvu. Võib olla väga palju gorutine ja need on kergekaalulised. Samaaegselt töötavate gorutinate arvu piiramiseks kasutatakse tavaliselt semafore või piiratud mahutavusega kanaleid.

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

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // Broneeri koht
    fmt.Printf("Tööline %d alustas\n", id)
    time.Sleep(time.Second) // Töö
    fmt.Printf("Tööline %d lõpetas\n", id)
    <-sem // Vabasta koht
}

func main() {
    const maxConcurrent = 3
    sem := make(chan struct{}, maxConcurrent) // Kanal piiranguga
    var wg sync.WaitGroup

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

    wg.Wait()
}

Siin kanal sem koos mahuga maxConcurrent piirab samaaegselt töötavate gorutinate arvu 3-ks.