Junior — Middle
Оё имкон дорад, ки миқдори goroutine-ҳои ҳамзамон дар барнома маҳдуд карда шаванд?
sobes.tech AI
Ҷавоб аз AI
Дар забони Go, механизм дарунсохташуда барои муқаррар кардани миқдори қатъии goroutine-ҳо, ки ҳамзамон оғоз мешаванд, вуҷуд надорад. Миқдори зиёде goroutine-ҳо метавонанд бошанд ва нақшабарорӣ ва гузаронидани онҳо аз ҷониби runtime-и Go идора карда мешавад.
Аммо, агар хоҳед, ки шумораи goroutine-ҳо, ки ҳамзамон иҷро мешаванд, маҳдуд кунед (масалан, барои назорати истифодаи захираҳо), метавонед семафорҳо ё каналҳоро барои маҳдуд кардани параллелизм истифода баред.
Масалан, маҳдуд кардани шумораи goroutine-ҳо, ки ҳамзамон кор мекунанд, бо истифода аз канал:
package main
import (
"fmt"
"sync"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // дастрасӣ ба манбаъ
fmt.Printf("Goroutine %d оғоз ёфт\n", id)
// ... кор ...
fmt.Printf("Goroutine %d тамом шуд\n", id)
<-sem // озод кардани манбаъ
}
func main() {
const maxGoroutines = 5
sem := make(chan struct{}, maxGoroutines)
var wg sync.WaitGroup
for i := 0; i < 20; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Дар ин мисол, бештар аз 5 goroutine ҳамзамон кор нахоҳад кард.