Sobes.tech
Junior — Middle

Go dilində eyni zamanda işləyən axınların sayına məhdudiyyət qoymaq mümkündürmü?

sobes.tech Süni İntellekt

AI-dan cavab

Go dilində, birbaşa işləyən goroutinların (yüngül ipliklərin) sayını məhdudlaşdırmaq üçün daxili mexanizm yoxdur. Çox sayda goroutin ola bilər və onlar yüngüldür. Eyni vaxtda işləyən goroutinların sayını məhdudlaşdırmaq üçün adətən semaforlar və ya məhdud tutuma malik kanallar istifadə olunur.

Kanaldan istifadə edərək eyni vaxtda işləyən goroutinların sayını məhdudlaşdırma nümunəsi:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // Yer ayır
    fmt.Printf("İşçi %d başladı\n", id)
    time.Sleep(time.Second) // İş
    fmt.Printf("İşçi %d bitdi\n", id)
    <-sem // Yer boşalt
}

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

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

    wg.Wait()
}

Burada, sem kanalı maxConcurrent ilə tamponla, eyni vaxtda işləyən goroutinların sayını 3-ə məhdudlaşdırır.