count / display the number of active goroutines

后端 未结 1 637
误落风尘
误落风尘 2020-12-18 20:57

I have a queue and a function that does both dequeueing and enqueueing. I want to make sure that the right amount of goroutines operate on the queue, as long as there is som

相关标签:
1条回答
  • 2020-12-18 21:58

    There's runtime.NumGoroutine but you're approaching this wrong.

    1. Your loops will keep spawning goroutines.
    2. this will unnecessarily burn cpu cycles because of the for loop.

    One approach is to use a sync.WaitGroup.

    func deen(wg *sync.WaitGroup, queue chan int) {
        for element := range queue {
            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)
            }
            wg.Done()
        }
    }
    
    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 len", len(queue)) //this must be 0
    
    }
    

    playground

    --- old buggy version with a race in it ---

    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
    }
    

    playground

    0 讨论(0)
提交回复
热议问题