Sobes.tech
Junior — Middle

Vai ir iespējams noteikt ierobežojumu vienlaikus palaistu goroutine skaitam programmā?

sobes.tech AI

Atbilde no AI

Go valodā nav iebūvēta mehānisma, kas stingri noteiktu vienlaicīgi palaistu gorutīnu skaitu. Var būt ļoti daudz gorutīnu, un to plānošanu un pārslēgšanos veic Go laika pārvaldnieks.

Tomēr, ja vēlaties ierobežot vienlaicīgi izpildāmo gorutīnu skaitu (piemēram, resursu izmantošanas kontrolei), varat izmantot semaforus vai kanālus paralēlismu ierobežošanai.

Piemērs, kā ierobežot vienlaicīgi strādājošo gorutīnu skaitu, izmantojot kanālu:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // resursa iegūšana
    fmt.Printf("Gorutīna %d sāka darbu\n", id)
    // ... darbs ...
    fmt.Printf("Gorutīna %d pabeidza darbu\n", id)
    <-sem // resursa atbrīvošana
}

func main() {
    const maxGoroutines = 5
    sem := make(chan struct{}, maxGoroutines)
    var wg sync.WaitGroup

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

    wg.Wait()
}

Šajā piemērā vienlaicīgi darbosies ne vairāk kā 5 gorutinas.