Sobes.tech
Junior — Middle

Kaip nustatyti ribą, kiek vienu metu gali būti paleista goroutine'ų kalboje Go?

sobes.tech AI

Atsakymas iš AI

Go kalboje nėra įmontuoto mechanizmo tiesiogiai apriboti vienu metu veikiančių gorutinų skaičių. Tačiau, norint kontroliuoti paralelizmo limitą, dažnai naudojami semaforai arba kanalai su ribotu talpumu.

Pavyzdys, kaip apriboti vienu metu veikiančių gorutinų 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{}{} // užimti vietą
    fmt.Printf("Goroutine %d pradėjo darbą\n", id)
    time.Sleep(time.Second) // darbo imitacija
    fmt.Printf("Goroutine %d baigė darbą\n", id)
    <-sem // atlaisvinti vietą
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // kanalas su buferiu, ribojantis gorutinų skaičių
    var wg sync.WaitGroup

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

Šiame pavyzdyje, kanalas sem su buferiu maxGoroutines riboja vienu metu veikiančių gorutinų skaičių. Kiekviena gorutina, prieš pradedant darbą, į kanalą įdeda tuščią struktūrą, užimdama vietą, o po darbo pabaigos ją išlaisvina. Taip veikia ne daugiau kaip maxGoroutines gorutinų vienu metu.