【问题标题】:How to run the maximum number of goroutines如何运行最大数量的 goroutine
【发布时间】:2020-07-12 20:07:16
【问题描述】:

代码是这样的:

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),以便能够同时处理。

【问题讨论】:

  • 我知道,我已经解决了我的问题如下,虽然性能可能会很低。开始 := len / numThread 线程 := 0;线程

标签: multithreading go max goroutine


【解决方案1】:

最大化吞吐量是为了摆脱瓶颈。首先找出最浪费时间的地方。

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

找出导致程序变慢的主要原因 - 然后让它变快。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我能想到的最好方法是一个固定大小的 goroutine 工作池,如 https://gobyexample.com/worker-pools 中所述

      【讨论】:

        猜你喜欢
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 2021-08-21
        • 2023-02-09
        相关资源
        最近更新 更多