Sobes.tech
Junior — Middle

Dasturda bir vaqtning o'zida ishga tushiriladigan goroutinelar soniga chegarani belgilash mumkinmi?

sobes.tech AI

AIdan javob

Go tilida, bir vaqtning o'zida ishga tushiriladigan goroutinlar soniga qattiq cheklov qo'yish uchun o'rnatilgan mexanizm mavjud emas. Juda ko'p goroutinlar bo'lishi mumkin va ularning rejalashtirilishi va almashinuvi Go-ning ish vaqti tomonidan boshqariladi.

Ammo, agar siz bir vaqtning o'zida bajarilayotgan goroutinlar sonini cheklashni istasangiz (masalan, resurslardan foydalanishni nazorat qilish uchun), semaforlar yoki kanallar yordamida parallelizmni cheklash mumkin.

Bir kanal yordamida bir vaqtning o'zida ishlayotgan goroutinlar sonini cheklash misoli:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // resursni egallash
    fmt.Printf("Goroutine %d ish boshladi\n", id)
    // ... ish ...
    fmt.Printf("Goroutine %d ishni tugatdi\n", id)
    <-sem // resursni bo'shatish
}

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()
}

Ushbu misolda, bir vaqtning o'zida 5 dan ortiq goroutinlar ishlamaydi.