如何在golang中运行最大数量的goroutine?

时间:2017-11-04 17:37:50

标签: multithreading go max goroutine

代码是这样的:

func find(start int, end int){
    for i := start; i < end ; i++ {
        // Do something...
    }
}

func main() {
    // Do something...
    // For example, I know: len = 1500
    // and run max goroutine are 3
    // will be
    go find(0, 500)
    go find(500, 1000)
    go find(1000, 1500)
    // Do something...
}

那时我事先知道goroutines的最大线程和“length”的长度。 但是,如果我不知道goroutine可以运行多少个线程,以及“长度”的长度。有没有办法将“长度”划分为相等的部分进行线程处理? 例如:length = 10,可以运行的最大goroutine是2,它将长度分成2个线程(10/2,每个长度为5),以便能够同时处理。

3 个答案:

答案 0 :(得分:2)

最大化吞吐量是为了摆脱瓶颈。首先找到大部分时间丢失的地方。

有时候运行太多的goroutine会让事情变得更快,但会让它们变慢,因为goroutines开始争夺资源。通常,最快的配置是以最有效的方式使用资源的配置:如果事情受到计算的限制,那么最好将运行的goroutine的数量设置为等于CPU核心的数量。但如果受到IO的限制,则通过测量其性能来选择最佳数量。

找到减慢程序速度的主要因素 - 然后加快速度。

答案 1 :(得分:0)

我知道我已经看过并阅读有关工作安排策略的参考资料,但我现在找不到好的参考资料。但是你有一些基本的选择:

  • 提前将你的工作分成相等的块。
  • 选择一个块大小并向线程发出块直到完成。
  • 工作窃取:创建线程,发布块,从其他线程完成早期窃取工作的线程。

所有这些都在Go中工作。要查找Go运行时可用的实际线程数,请查看https://golang.org/pkg/runtime/#GOMAXPROCS

此外,仅从经验来看,渠道很诱人。但为了获得最佳性能,请勿在频道中发送单个工作项。而是在每条消息中发送工作项的数组/切片。否则,频道的锁定开销可能比实际工作更耗时。

答案 2 :(得分:0)

我能想到的最佳方式是固定大小的goroutine工作池,如https://gobyexample.com/worker-pools

中所述