Sobes.tech
Junior — Middle

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

sobes.tech AI

AIден жооп

Go тилинде, түз эле иштеп жаткан goroutine'лердин (же жеңил жиптердин) санын түздөн-түз чектөөчү механизми жок. Көптөгөн goroutine'лер болушу мүмкүн жана алар жеңил. Бир убакта иштеп жаткан 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("Жумушчу %d баштады\n", id)
    time.Sleep(time.Second) // Жумуш
    fmt.Printf("Жумушчу %d аяктады\n", id)
    <-sem // Орунду бошотуу
}

func main() {
    const maxConcurrent = 3
    sem := make(chan struct{}, maxConcurrent) // Канал чектелген
    var wg sync.WaitGroup

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

    wg.Wait()
}

Мында, sem каналы, анын буферлөө maxConcurrent, бир убакта иштеп жаткан goroutine'лердин санын 3кө чектейт.