ChanX:Go 構建無限緩衝通道
chanx (github.com/smallnest/chanx) 一個用環形緩衝區(ringbuffer)實現的無界通道(unbounded channel)的 Go 語言庫。
它非常適合在需要異步處理、生產者快於消費者、或對標準通道容量受限(如 make(chan T, N))感到不滿足的場景中使用。
爲什麼需要 Unbounded Channel?Go 原生的 chan 是有限容量的:
-
默認是阻塞的(無緩衝)。
-
即使有緩衝,也需要預先定義大小。
-
對於數據突發或短時間大量堆積的場景不夠靈活。
參考社區中關於這個話題的幾個重要討論:
-
https://github.com/golang/go/issues/20352:爲什麼 Go 沒有內建的 unbounded channel?
-
https://stackoverflow.com/questions/41906146/why-go-channels-limit-the-buffer-size:stackoverflow 問答:關於 Go channel 容量爲何有限。
-
https://medium.com/capital-one-tech/building-an-unbounded-channel-in-go-789e175cd2cd:如何構建自定義無界 channel。
安裝
go get -u github.com/smallnest/chanx
基本使用
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
ch := chanx.NewUnboundedChan[int](ctx, 100)
go func() {
for v := range 10 {
ch.In <- v // send values
}
close(ch.In) // close In channel
}()
for v := range ch.Out { // read values
fmt.Println(v)
}
核心思想
chanx 實現了一個 “看起來是無界” 的 channel,本質上是: 加了一個 ringbuffer 緩衝區 + goroutine 異步調度,在生產快於消費時承接中間壓力,從而避免寫阻塞。
References
https://github.com/smallnest/chanx
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/EBuiL2Jx6UTC6EE_spQ6hw