Junior — Middle
Ինչպե՞ս որոշել միաժամանակ գործարկվող goroutine-ների քանակի սահմանը Go լեզվում։
sobes.tech AI
Պատասխան AI-ից
Go լեզվում չկա ներմուծված մեխանիզմ ուղղակիորեն սահմանափակելու համար միաժամանակ աշխատող goroutinների քանակը։ Սակայն, որպեսզի վերահսկել պարալելիզմի սահմանը, սովորաբար օգտագործում են սեմաֆորներ կամ սահմանափակ ծավալով ալիքներ։
Օրինակ՝ սահմանափակելու միաժամանակ աշխատող goroutinների քանակը ալիքով՝
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // զբաղեցնում ենք տեղ
fmt.Printf("Goroutine %d սկսեց աշխատել\n", id)
time.Sleep(time.Second) // աշխատանքային սիմուլացիա
fmt.Printf("Goroutine %d ավարտեց աշխատանքը\n", id)
<-sem // ազատում ենք տեղ
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // ալիք՝ սահմանափակելով goroutinների քանակը
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Այս օրինակով, sem ալիքը, որի բաֆերը maxGoroutines է, սահմանափակում է միաժամանակ աշխատող goroutinների քանակը։ Ամեն goroutine նախքան աշխատանքի մեկնարկը, տեղ է զբաղեցնում ալիքով, իսկ ավարտից հետո ազատում։ Այսպիսով, միաժամանակ աշխատում է ոչ ավել քան maxGoroutines goroutin։