Multithreading 如何运行最大数量的goroutine

Multithreading 如何运行最大数量的goroutine,multithreading,go,max,goroutine,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 fin

代码如下所示:

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...
}
func查找(起始整型,结束整型){
对于i:=开始;i
这就是我预先知道goroutine的最大线程数和“length”的长度的时候。 但是如果我不知道goroutine可以运行多少线程,以及“length”的长度。有没有办法将“长度”分成相等的部分进行线程处理?
例如:length=10,可以运行的最大goroutine是2,它将长度拆分为2个线程(10/2,每个线程的长度是5),以便能够同时处理。

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

  • 提前将你的工作分成等份
  • 选择块大小并向线程发出块,直到完成
  • 工作窃取:创建线程、发布块、提前完成的线程从其他线程窃取工作
所有这些工作都在进行中。要查找Go运行时可用的实际线程数,请查看


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

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

  • 提前将你的工作分成等份
  • 选择块大小并向线程发出块,直到完成
  • 工作窃取:创建线程、发布块、提前完成的线程从其他线程窃取工作
所有这些工作都在进行中。要查找Go运行时可用的实际线程数,请查看


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

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

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


找出让你的程序变慢的主要原因——然后让它变快

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

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


找出让你的程序变慢的主要原因——然后让它变快

我能想到的最好的方法是固定大小的goroutine工作池,如

中所述。我能想到的最好的方法是固定大小的goroutine工作池,如

中所述。我知道,我已经解决了以下问题,尽管性能可能很低。开始:=len/numThread,对于线程:=0;螺纹