Sobes.tech
Junior — Middle

Kuidas määrata Go keeles samaaegselt käivitatavate goroutine'ide arvu limiit?

sobes.tech AI

Vastus AI-lt

Go keeles ei ole sisseehitatud mehhanismi otse samaaegselt käivitatavate gorutinite arvu piiramiseks. Kuid paralleelsuse limiidi kontrollimiseks kasutatakse tavaliselt semafore või piiratud mahutavusega kanaleid.

Näide samaaegselt töötavate gorutinite arvu piiramisest 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("Goroutine %d alustas tööd\n", id)
    time.Sleep(time.Second) // töö simulatsioon
    fmt.Printf("Goroutine %d lõpetas tööd\n", id)
    <-sem // vabasta koht
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // kanal piirab gorutinite arvu
    var wg sync.WaitGroup

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

Selles näites piirab sem kanal, mille mahutavus on maxGoroutines, samaaegselt töötavate gorutinite arvu. Iga gorutina, enne töö alustamist, paneb kanali tühja struktuuri, mis hõivab koha, ja vabastab selle pärast töö lõpetamist. Nii töötab samaaegselt mitte rohkem kui maxGoroutines gorutinit.