Sobes.tech
Junior — Middle

Коддой колдонмодо активдүү агымдардын санын кантип көзөмөлдөсө болот?

sobes.tech AI

AIден жооп

Go тилинде, актив агымдардын (goroutine) санын көзөмөлдөө үчүн адатта синхрондоштуруу жана параллелизмди чектөө механизмдери колдонулат:

  • Буферленген каналдар сыяктуу семафорлор: чектелген сыйымдылыктагы канал түзүп, goroutine баштаардан мурун ага маанини жиберип, аяктагандан кийин кабыл алып, ошентип бир убакта иштеп жаткан goroutineдардын санын чектейт.

  • sync.WaitGroup пакети: goroutine топтому аяктагандан кийин күтүүгө жардам берет, бирок алардын санын чектебейт.

  • golang.org/x/sync/semaphore пакети: ыңгайлуу семафорду камсыз кылат, параллелизмди чектөө үчүн.

Мисал катары семафор каналын колдонуу:

sem := make(chan struct{}, 5) // максимум 5 goroutine бир убакта

for _, task := range tasks {
    sem <- struct{}{} // блоктоп калат, эгерде 5 goroutine иштеп жатса
    go func(t Task) {
        defer func() { <-sem }() // орун бошотуу
        process(t)
    }(task)
}

// бардык goroutineдар аяктагандан кийин күтүү
for i := 0; i < cap(sem); i++ {
    sem <- struct{}{}
}

Бул ыкма менен актив агымдардын санын көзөмөлдөп, ресурстарды ашыкча колдонуу алдын алууга болот.