Senior
Сизде көптөгөн goroutines түзүлүүчү кызмат бар. Кандайча бир убакта иштеп жаткан goroutines санын чектейсиз?
sobes.tech AI
AIден жооп
Goда бир убакта иштеп жаткан goroutineдердин санын чектөө үчүн көбүнчө семафорлор же буферленген каналдар колдонулат. Идея — максималдуу параллелдүү goroutineдердин санына барабар капаситетке ээ канал түзүү жана goroutine ишке киргизүүдөн мурун ага бир маанини жөнөтүү, жана аяктагандан кийин ал маанини алып салуу, кийинкисине орун бошотуу.
Мисал:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // орун алуу
defer func() { <-sem }() // иш аяктагандан кийин орун бошотуу
fmt.Printf("Жумушчу %d баштады\n", id)
time.Sleep(1 * time.Second) // иштин симуляциясы
fmt.Printf("Жумушчу %d аяктады\n", id)
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent)
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Бул мисалда, бир убакта 3 гана goroutine иштей алат.