doumangzhen7204 2014-09-26 02:18
浏览 55
已采纳

计算/显示活动goroutine的数量

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 something in the list.

This is the code I am using, but I was wondering if there is a way of printing the amount of currently active goroutines

Link to playground

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条回答 默认 最新

  • dtz63853 2014-09-26 02:27
    关注

    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 {
            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
    }
    

    <kbd>playground</kbd>

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算