Junior — Middle
Go tilida bir vaqtning o'zida ishga tushiriladigan goroutinelar sonining chegarasini qanday aniqlash mumkin?
sobes.tech AI
AIdan javob
Go tilida to'g'ridan-to'g'ri ishga tushirilayotgan gorutinlar sonini cheklash uchun o'rnatilgan mexanizm mavjud emas. Biroq, paralellik limitini nazorat qilish uchun odatda semaforlar yoki cheklangan sig'imga ega kanallar ishlatiladi.
Bir kanal yordamida bir vaqtning o'zida ishlayotgan gorutinlar sonini cheklash misoli:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // joyni egallash
fmt.Printf("Goroutine %d ish boshladi\n", id)
time.Sleep(time.Second) // ishni simulyatsiya qilish
fmt.Printf("Goroutine %d ishni tugatdi\n", id)
<-sem // joyni bo'shatish
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // tampon bilan cheklangan kanal
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Ushbu misolda, sem nomli kanal maxGoroutines tampon bilan bir vaqtning o'zida ishlayotgan gorutinlar sonini cheklaydi. Har bir goroutine ish boshlashdan oldin kanalga bo'sh struktura joylashtiradi, joyni egallaydi va ish tugagach, uni bo'shatadi. Shu tarzda, faqat maxGoroutines gorutin bir vaqtning o'zida ishlaydi.