这是我的问题:调用者将创建多个 goroutines 来运行我的代码 doWork
,
go func() {
for data := range dataSet {
doWork(data)
}
}()
现在,我想统计有多少 goroutines 开始做这项工作,尽管我不能修改或读取来自调用者的数据。我怎样才能做到这一点?
[update] doWork
传递给调用者,例如:
doWork := func(i int) {
testArray[i]++
...
}
Parallelize(workerNumber, doWork)
所以我打算使用一个全局变量作为计数器。
最佳答案
runtime.NumGoroutines()
应该给你一个全局数字,所以假设你不能依赖它,你需要计算这个特定过程启动了多少 goroutines,而不是可能更多复杂的应用程序。
正如您所说,一种解决方案可能是使用全局计数器。请记住,在这种情况下存在竞争,因此您最好使用同步方法,例如使用 atomic operations .
就个人而言,我不喜欢全局变量,因此我更喜欢的解决方案可能是使用闭包通过使用 maker 函数(未经测试的代码)来生成一对(函数,计数变量):
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
。
关于戈朗 : calculate how many goroutines are started by worker itself?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37522286/