Sobes.tech
Junior — Middle

Go тилинде бир убакта ишке ашырылып жаткан goroutineдердин санын кантип чектөө керек?

sobes.tech AI

AIден жооп

Go тилинде түз эле ишке ашырылган goroutine санын чектөөчү механизми жок. Бирок, параллелизм лимитин көзөмөлдөө үчүн көбүнчө семафорлор же чектелген сыйымдуулуктагы каналдар колдонулат.

Канал аркылуу бир убакта иштеп жаткан goroutine санын чектөө мисалы:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // орунду ээлөө
    fmt.Printf("Goroutine %d ишке кирди\n", id)
    time.Sleep(time.Second) // ишти моделдөө
    fmt.Printf("Goroutine %d ишин аяктады\n", id)
    <-sem // орунду бошотуу
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // буфер менен канал, goroutine санын чектейт
    var wg sync.WaitGroup

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

Бул мисалда, sem каналы, анын буферу maxGoroutines, бир убакта иштеп жаткан goroutine санын чектейт. Ар бир goroutine ишке киришерден мурун, каналга бош структураны салат, орун ээлейт жана иши аяктагандан кийин бошотот. Ошентип, бир убакта эң көп maxGoroutines goroutine иштейт.