Sobes.tech
Junior — Middle

Ar įmanoma nustatyti ribą vienu metu veikiančių srautų skaičiui Go kalboje?

sobes.tech AI

Atsakymas iš AI

Go kalboje nėra įmontuoto mechanizmo tiesiogiai apriboti vienu metu veikiančių gorutinių (lengvų siūlų) skaičių. Gali būti labai daug gorutinių, ir jos yra lengvos. Norint apriboti vienu metu veikiančių gorutinių skaičių, dažnai naudojami semaforai arba kanalai su ribotu talpa.

Pavyzdys, kaip apriboti vienu metu veikiančių gorutinių skaičių naudojant kanalą:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // Rezervuoti vietą
    fmt.Printf("Darbininkas %d pradėjo\n", id)
    time.Sleep(time.Second) // Darbas
    fmt.Printf("Darbininkas %d baigė\n", id)
    <-sem // Atlaisvinti vietą
}

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

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

    wg.Wait()
}

Čia kanalas sem su buferiu maxConcurrent apriboja vienu metu veikiančių gorutinių skaičių iki 3.