Golang:计算工人自己创造了多少个goroutine?

时间:2016-05-30 09:33:58

标签: go goroutine

这是我的问题:调用者将创建几个goroutine来运行我的代码doWork

go func() {
    for data := range dataSet {
        doWork(data)
    }
}()

现在,我想计算有多少goroutine开始做这项工作,虽然我无法修改或读取来自调用者的数据。我怎样才能做到这一点?

[update] doWork传递给调用者,例如:

   doWork := func(i int) {
        testArray[i]++
        ...
    }

   Parallelize(workerNumber, doWork)

所以我打算使用全局变量作为计数器。

1 个答案:

答案 0 :(得分:0)

runtime.NumGoroutines()应该给你一个全局数字,所以我们假设你不能依赖它,你需要计算这个特定程序启动了多少个goroutine,而不是可能更复杂的应用程序。

正如您所说,一种解决方案可能是使用全球计数器。请记住,在这种情况下有比赛,因此您最好使用同步方法,例如使用atomic operations

就个人而言,我不喜欢全局变量,因此我更喜欢的解决方案是使用闭包来通过使用制造商函数(未经测试的代码)来生成一对(函数,计数变量):

func makeCounted(n int) ([]uint64, func(int)) {
    var counters []uint64 = make([]uint64, n)
    return counters, func(i int) {
        atomic.AddUint64(&counters[i], 1)
        fmt.Println("Doing stuff")
    }
}

howMany, doWork := makeCounted()
Parallelize(workers, doWork)

如果n未知(len(dataSet)未知),则必须动态增长计数器的大小,但您可能需要sync.Mutex之类的内容。< / p>