这是我的问题:调用者将创建几个goroutine来运行我的代码doWork
,
go func() {
for data := range dataSet {
doWork(data)
}
}()
现在,我想计算有多少goroutine开始做这项工作,虽然我无法修改或读取来自调用者的数据。我怎样才能做到这一点?
[update] doWork
传递给调用者,例如:
doWork := func(i int) {
testArray[i]++
...
}
Parallelize(workerNumber, doWork)
所以我打算使用全局变量作为计数器。
答案 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>