Sobes.tech
Junior — Middle

Ինչպե՞ս կարելի է վերահսկել ծրագրում ակտիվ հոսքերի թիվը։

sobes.tech AI

Պատասխան AI-ից

Go լեզվում սովորաբար ակտիվ հոսքերի (goroutines) քանակը վերահսկելու համար օգտագործվում են սինխրոնիզացիայի և պարալելիզմի սահմանափակման մեխանիզմներ՝

  • Բուֆերային ալիքներ որպես սեմաֆորներ: ստեղծում են սահմանափակ ծավալով ալիք և նախքան 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{}{}
}

Այս կերպ կարելի է վերահսկել ակտիվ հոսքերի քանակը և խուսափել ռեսուրսների գերօգտագործումից։