Sobes.tech
Junior — Middle

Go tilida bir vaqtning o'zida ishlayotgan oqimlar soniga cheklov qo'yish mumkinmi?

sobes.tech AI

AIdan javob

Go tilida, to'g'ridan-to'g'ri ishlayotgan goroutinlarning (yengil oqimlar) sonini cheklash uchun o'rnatilgan mexanizm mavjud emas. Juda ko'p goroutinlar bo'lishi mumkin va ular yengil. Bir vaqtning o'zida ishlayotgan goroutinlar sonini cheklash uchun odatda semaforlar yoki cheklangan sig'imga ega kanallar ishlatiladi.

Kanaldan foydalanib, bir vaqtning o'zida ishlayotgan goroutinlar sonini cheklash misoli:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // O'rin band qilish
    fmt.Printf("Ishchi %d boshladi\n", id)
    time.Sleep(time.Second) // Ish
    fmt.Printf("Ishchi %d tugadi\n", id)
    <-sem // O'rinni bo'shatish
}

func main() {
    const maxConcurrent = 3
    sem := make(chan struct{}, maxConcurrent) // Cheklovli kanal
    var wg sync.WaitGroup

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

    wg.Wait()
}

Bu yerda, sem kanali maxConcurrent bilan buffer bilan, bir vaqtning o'zida ishlayotgan goroutinlar sonini 3 ga cheklaydi.