Junior — Middle
Go dilində eyni vaxtda işləyən goroutinlərin sayının limitini necə müəyyən etmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
Go dilində, birbaşa işləyən gorutinlərin sayını məhdudlaşdırmaq üçün daxili mexanizm yoxdur. Ancaq, paralelliyi idarə etmək üçün adətən semaforlar və ya məhdudiyyətli tutuma malik kanallar istifadə olunur.
Bir kanal vasitəsilə eyni vaxtda işləyən gorutinlərin 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("Goroutine %d işə başladı\n", id)
time.Sleep(time.Second) // işin simulyasiyası
fmt.Printf("Goroutine %d işini bitirdi\n", id)
<-sem // yer boşaldır
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // tamponlu kanal, gorutinlərin sayını məhdudlaşdırır
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Bu nümunədə, sem adlı kanal maxGoroutines tamponu ilə eyni vaxtda işləyən gorutinlərin sayını məhdudlaşdırır. Hər bir goroutine işə başlamazdan əvvəl kanala boş strukturu yerləşdirir, yer tutaraq və işi bitdikdən sonra onu azad edir. Beləliklə, eyni vaxtda ən çox maxGoroutines gorutini işləyə bilər.