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.