Junior — Middle
Go тилинде бир убакта ишке ашырылып жаткан goroutineдердин санын кантип чектөө керек?
sobes.tech AI
AIден жооп
Go тилинде түз эле ишке ашырылган goroutine санын чектөөчү механизми жок. Бирок, параллелизм лимитин көзөмөлдөө үчүн көбүнчө семафорлор же чектелген сыйымдуулуктагы каналдар колдонулат.
Канал аркылуу бир убакта иштеп жаткан goroutine санын чектөө мисалы:
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) // буфер менен канал, goroutine санын чектейт
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Бул мисалда, sem каналы, анын буферу maxGoroutines, бир убакта иштеп жаткан goroutine санын чектейт. Ар бир goroutine ишке киришерден мурун, каналга бош структураны салат, орун ээлейт жана иши аяктагандан кийин бошотот. Ошентип, бир убакта эң көп maxGoroutines goroutine иштейт.