golang select兩個channel性能穩(wěn)定,三個channel時性能會發(fā)生抖動,為什么?
答題思路
select —> 讓 Goroutine同時等待多個 Channel 可讀或者可寫 —> Goroutine —> 調(diào)度器調(diào)度 —> 資源競爭 —> 不穩(wěn)定、抖動
在 Go 中,select 語句用于在多個通道操作中進行選擇。當有多個通道準備好發(fā)送或接收數(shù)據(jù)時,select 會隨機選擇一個可用的通道操作執(zhí)行,當select語句中的通道數(shù)量增加時,可能會導致性能方面的變化,尤其是在高并發(fā)場景下。
性能穩(wěn)定與性能抖動的問題通常與調(diào)度器和 Goroutine 的調(diào)度策略有關。在只有兩個通道的情況下,Goroutine 可以在兩個通道之間輕松切換,這可以保持較為穩(wěn)定的性能。
但是,在三個或更多通道的情況下,調(diào)度器需要更復雜的調(diào)度策略來選擇下一個要執(zhí)行的 Goroutine。這可能導致不同的 Goroutine 之間競爭資源,例如 CPU 時間和內(nèi)存帶寬。在高負載情況下,這種競爭可能導致性能抖動,即執(zhí)行時間的不穩(wěn)定性。
此外,如果通道的負載不均衡,例如某個通道的寫入速度遠快于其他通道,或者某個通道的讀取速度遠慢于其他通道,也會導致性能抖動。這可能會導致某些 Goroutine 被阻塞,而其他 Goroutine 必須等待更長的時間才能執(zhí)行。
因此,在編寫使用select語句的代碼時,需要考慮通道的負載情況以及系統(tǒng)的并發(fā)性能。通常情況下,使用有限的通道數(shù)量,并確保它們的負載大致相等,可以減少性能抖動的可能性。
(為了提高性能和穩(wěn)定性,可以考慮使用帶有緩沖通道或使用扇入/扇出模式來處理多個通道操作。使用帶有緩沖的通道可以減少對通道的頻繁操作,而扇入/扇出模式可以將多個通道操作合并為一個操作,減少select 的使用次數(shù)。)文章來源:http://www.zghlxwxcb.cn/news/detail-829896.html
//Select 和 Channel
//select是與switch相似的控制結(jié)構,與switch不同的是,select中雖然也有多個case,但是這些case中的表達式必須都是 Channel 的收發(fā)操作。下面的代碼就展示了一個包含 Channel 收發(fā)操作的select結(jié)構:
package main
import "fmt"
func main() {
c := make(chan int, 1)
quit := make(chan int, 1)
fibonacci(c, quit)
}
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case quit <- y:
x, y = x+y, y
case <-quit:
fmt.Println("quit", x, y)
return
case <-c:
fmt.Println("c", x, y)
return
default:
fmt.Println("default")
return
}
}
}
參考
https://zhuanlan.zhihu.com/p/564277331
https://worktile.com/kb/p/46336文章來源地址http://www.zghlxwxcb.cn/news/detail-829896.html
到了這里,關于golang select兩個channel性能穩(wěn)定,三個channel時性能會發(fā)生抖動,為什么?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!