Junior — Middle
Go tilida bir vaqtning o'zida ishlayotgan oqimlar soniga cheklov qo'yish mumkinmi?
sobes.tech AI
AIdan javob
Go tilida, to'g'ridan-to'g'ri ishlayotgan goroutinlarning (yengil oqimlar) sonini cheklash uchun o'rnatilgan mexanizm mavjud emas. Juda ko'p goroutinlar bo'lishi mumkin va ular yengil. Bir vaqtning o'zida ishlayotgan goroutinlar sonini cheklash uchun odatda semaforlar yoki cheklangan sig'imga ega kanallar ishlatiladi.
Kanaldan foydalanib, bir vaqtning o'zida ishlayotgan goroutinlar sonini cheklash misoli:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // O'rin band qilish
fmt.Printf("Ishchi %d boshladi\n", id)
time.Sleep(time.Second) // Ish
fmt.Printf("Ishchi %d tugadi\n", id)
<-sem // O'rinni bo'shatish
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent) // Cheklovli kanal
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Bu yerda, sem kanali maxConcurrent bilan buffer bilan, bir vaqtning o'zida ishlayotgan goroutinlar sonini 3 ga cheklaydi.