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),以便能够同时处理。我知道我已经看到并阅读了有关作业调度策略的参考文献,但我现在找不到一个好的。但你有一些基本的选择:
- 提前将你的工作分成等份
- 选择块大小并向线程发出块,直到完成
- 工作窃取:创建线程、发布块、提前完成的线程从其他线程窃取工作
而且,仅仅从经验来看,渠道很诱人。但是为了获得最佳性能,不要在通道中发送单个工作项。改为在每条消息中发送工作项的数组/切片。否则,通道的锁定开销可能会比实际工作更耗时。我知道我已经看到并阅读了有关作业调度策略的参考资料,但我现在找不到一个好的。但你有一些基本的选择:
- 提前将你的工作分成等份
- 选择块大小并向线程发出块,直到完成
- 工作窃取:创建线程、发布块、提前完成的线程从其他线程窃取工作
而且,仅仅从经验来看,渠道很诱人。但是为了获得最佳性能,不要在通道中发送单个工作项。改为在每条消息中发送工作项的数组/切片。否则,通道的锁定开销可能会比实际工作更耗时。最大化吞吐量就是要摆脱瓶颈。首先,找出最浪费时间的地方 有时候运行太多的goroutine并不会让事情变得更快,反而会让事情变得更慢,因为goroutine开始争夺资源。通常最快的配置是以最有效的方式使用资源的配置:如果事情受到计算的限制,那么最好将正在运行的goroutine的数量设置为CPU核心的数量。但是,如果它受到IO的限制,则通过测量其性能来选择最佳数量
找出让你的程序变慢的主要原因——然后让它变快 最大化吞吐量就是要摆脱瓶颈。首先,找出最浪费时间的地方 有时候运行太多的goroutine并不会让事情变得更快,反而会让事情变得更慢,因为goroutine开始争夺资源。通常最快的配置是以最有效的方式使用资源的配置:如果事情受到计算的限制,那么最好将正在运行的goroutine的数量设置为CPU核心的数量。但是,如果它受到IO的限制,则通过测量其性能来选择最佳数量
找出让你的程序变慢的主要原因——然后让它变快 我能想到的最好的方法是固定大小的goroutine工作池,如中所述。我能想到的最好的方法是固定大小的goroutine工作池,如中所述。我知道,我已经解决了以下问题,尽管性能可能很低。开始:=len/numThread,对于线程:=0;螺纹