Sobes.tech
Junior — Middle

Kako odrediti limit broja istovremeno pokrenutih gorutina u jeziku Go?

sobes.tech АИ

Одговор од АИ

U jeziku Go ne postoji ugrađeni mehanizam za direktno ograničavanje broja gorutina koje se istovremeno pokreću. Međutim, za kontrolu limita paralelizma, obično se koriste semafori ili kanali sa ograničenom kapacitetom.

Primer ograničavanja broja istovremeno pokrenutih gorutina pomoću kanala:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // zauzima mesto
    fmt.Printf("Goroutine %d je počela sa radom\n", id)
    time.Sleep(time.Second) // simulacija rada
    fmt.Printf("Goroutine %d je završila sa radom\n", id)
    <-sem // oslobađa mesto
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // kanal sa bufferom ograničava broj gorutina
    var wg sync.WaitGroup

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

U ovom primeru, kanal sem sa bufferom maxGoroutines ograničava broj gorutina koje se istovremeno izvršavaju. Svaka gorutina, pre početka rada, stavlja praznu strukturu u kanal, zauzima mesto, i oslobađa ga nakon završetka. Na taj način, ne više od maxGoroutines gorutina će raditi istovremeno.