戈朗 : calculate how many goroutines are started by worker itself?

标签 go goroutine

这是我的问题:调用者将创建多个 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/

相关文章:

go - Golang 中的游戏循环模拟

io - Golang 中的 Reader 接口(interface)和 Read 方法

json - 解码转义的 JSON 字符串

mysql - 如何告诉gorm保存丢失的时间。时间字段为NULL而不是 '0000-00-00'?

go - Golang行情自动收录机并发问题

go - 如何正确使用 channel 进行并发 POST API 调用并将数据记录在文件中

go - 使用互斥锁 - 仍然是死锁

go - 奇怪的协程行为

java - golang 服务器向 Android 发送字节数组

google-app-engine - 对 Google App Engine Go 运行时的搜索支持