Sobes.tech
Junior — Middle

Hoe bepaal je de limiet op het aantal gelijktijdig uitgevoerde goroutines in de Go-taal?

sobes.tech AI

Antwoord van AI

In de programmeertaal Go is er geen ingebouwd mechanisme om het aantal gelijktijdig uitgevoerde goroutines direct te beperken. Om het parallelisme te controleren, worden meestal semaforen of kanalen met beperkte capaciteit gebruikt.

Voorbeeld van het beperken van het aantal gelijktijdige goroutines met behulp van een kanaal:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // een plek reserveren
    fmt.Printf("Goroutine %d is begonnen\n", id)
    time.Sleep(time.Second) // werk simuleren
    fmt.Printf("Goroutine %d is klaar\n", id)
    <-sem // plek vrijmaken
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // kanaal met buffer beperkt aantal goroutines
    var wg sync.WaitGroup

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

In dit voorbeeld beperkt het kanaal sem met buffer maxGoroutines het aantal gelijktijdig werkende goroutines. Elke goroutine plaatst een lege structuur in het kanaal voordat hij begint met werken, waardoor een plek wordt ingenomen, en geeft deze vrij nadat hij klaar is. Op deze manier werken nooit meer dan maxGoroutines goroutines tegelijk.