Sobes.tech
Junior — Middle

Hogyan határozható meg a Go nyelvben az egyidejűleg futó goroutine-ok száma?

sobes.tech MI

Válasz az MI-től

A Go nyelvben nincs beépített mechanizmus a futó gorutinák számának közvetlen korlátozására. Azonban a párhuzamosság korlátjának ellenőrzésére általában szeminátorokat vagy korlátozott kapacitású csatornákat használnak.

Példa a futó gorutinák számának korlátozására csatorna segítségével:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // hely foglalása
    fmt.Printf("Goroutine %d elkezdte a munkát\n", id)
    time.Sleep(time.Second) // munka szimulálása
    fmt.Printf("Goroutine %d befejezte a munkát\n", id)
    <-sem // hely felszabadítása
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // csatorna pufferrel, korlátozza a gorutinák számát
    var wg sync.WaitGroup

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

Ebben a példában a sem nevű csatorna, amelynek pufferkapacitása maxGoroutines, korlátozza az egyszerre futó gorutinák számát. Minden gorutin, mielőtt elkezdené a munkát, egy üres struktúrát helyez el a csatornába, elfoglalva egy helyet, és a munka befejezése után felszabadítja azt. Így legfeljebb maxGoroutines gorutin fut egyszerre.