【问题标题】:Golang: calculate how many goroutines are started by worker itself?Golang:计算worker自己启动了多少个goroutine?
【发布时间】:2016-09-28 02:01:06
【问题描述】:

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

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

现在,我想计算有多少 goroutines 开始执行这项工作,尽管我无法修改或读取调用者的数据。我怎样才能做到这一点?

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

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

   Parallelize(workerNumber, doWork)

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

【问题讨论】:

  • 如何计算一个在 doWork 返回之前开始和结束的 goroutine?
  • 您可以使用runtime.NumGoroutine() 查询当前存在的goroutines 的数量。如果您可以限制不在代码的其他部分启动新的 goroutine(同时不完成任何部分),这可能会有所帮助,否则它不会“准确”(它不会是您想要的)。除非来电者给你更多的“洞察力”,否则你不会得到比这更好的帮助。实际上你不应该关心。代码的正确性不应该取决于调用它的 goroutine 的数量:它要么是 safe 用于并发使用(然后没关系),要么不是。
  • 你想达到什么目的?你真的想知道计数还是只想控制它们?因为你可以更好地使用频道或同步组
  • 我想统计 goroutine 的数量,这是我的指标的一部分

标签: go goroutine


【解决方案1】:

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

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

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

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 之类的东西。

【讨论】:

    猜你喜欢
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2014-12-24
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多