代码是这样的:
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),以便能够同时处理。
答案 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
中所述