подсчет / отображение количества активных goroutines
У меня есть очередь и функция, которая выполняет как dequeueing, так и enqueueing. Я хочу убедиться, что нужное количество горутин действуют по очереди, пока есть что-то в списке.
Это код, который я использую, но мне было интересно, есть ли способ распечатать количество активных goroutines
var element int
func deen(queue chan int) {
element := <-queue
fmt.Println("element is ", element)
if element%2 == 0 {
fmt.Println("new element is ", element)
queue <- (element*100 + 11)
queue <- (element*100 + 33)
}
}
func main() {
queue := make(chan int, 10)
queue <- 1
queue <- 2
queue <- 3
queue <- 0
for len(queue) != 0 {
for i := 0; i < 2; i++ {
go deen(queue)
}
}
fmt.Scanln()
fmt.Println("list is has len", len(queue)) //this must be 0
}
1 ответов
здесь runtime.NumGoroutine
но вы подходите к этому неправильно.
- ваши петли будут держать нерест goroutines.
- это будет излишне записывать циклы процессора из-за цикла for.
один подход заключается в использовании синхронизации.WaitGroup.
func deen(wg *sync.WaitGroup, queue chan int) {
for element := range queue {
wg.Done()
fmt.Println("element is ", element)
if element%2 == 0 {
fmt.Println("new element is ", element)
wg.Add(2)
queue <- (element*100 + 11)
queue <- (element*100 + 33)
}
}
}
func main() {
var wg sync.WaitGroup
queue := make(chan int, 10)
queue <- 1
queue <- 2
queue <- 3
queue <- 0
for i := 0; i < 4; i++ {
wg.Add(1)
go deen(&wg, queue)
}
wg.Wait()
close(queue)
fmt.Println("list is has len", len(queue)) //this must be 0
}