Sobes.tech
Senior

Xidmətiniz çox sayda goroutine yaradır. Eyni vaxtda işləyən goroutineların sayını necə məhdudlaşdırardınız?

sobes.tech Süni İntellekt

AI-dan cavab

Go-da eyni zamanda işləyən goroutinlərin sayını məhdudlaşdırmaq üçün tez-tez semaforlar və ya tamponlu kanallar istifadə olunur. Fikir odur ki, maksimum paralel goroutinlərin sayına bərabər tutuma malik kanal yaradılsın və goroutine işə salınmadan əvvəl bu kanala dəyər göndərilsin, və iş bitdikdən sonra isə onu çıxararaq növbəti üçün yer açılsın.

Nümunə:

package main

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

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{}          // yer ayır
    defer func() { <-sem }()   // iş bitdikdən sonra yer azad et

    fmt.Printf("İşçi %d başladı\n", id)
    time.Sleep(1 * time.Second) // işin simulyasiyası
    fmt.Printf("İşçi %d bitdi\n", id)
}

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

Bu nümunədə, eyni vaxtda ən çox 3 goroutine işləyəcək.