通道多路復用器:增強性能和功能
您對通道多路復用器功能Mux 的功能和輸出表示擔憂。讓我們解決您的每個問題:
1。 Mux 中出現錯誤?
Mux 的原始實作中存在一個小問題。從 Mux 產生的每個 goroutine 都嘗試從相同通道 (c) 拉取,因為 c 會隨著循環的每次迭代而更新。要解決此問題,請按值將通道傳遞給goroutine,如下所示:
for _, c := range channels { go func(c <-chan big.Int) { ... }(c) }
2.有限輸出
Mux 旨在將多個通道的輸出合併為一個。但是,在您的測試案例中,您僅從輸出通道接收最後十個值。這是因為輸入通道的關閉會觸發 Mux 中的倒數計時。當每個輸入通道關閉時,倒數計時遞減並最終達到零,導致輸出通道關閉。這意味著輸出通道將僅接收來自最後幾個關閉的輸入通道的值。
3.不尋常的餵食模式
由於您使用 goroutine 的方式,餵食模式是意外的。每個 goroutine 都從特定的輸入通道中提取值並將其發送到輸出通道。然而,由於 goroutine 是獨立的,因此它們可以同時執行並以不確定的順序將值傳送到輸出通道。這導致餵食明顯不規則。
4.更好的方法
為了提高 Mux 的效能和功能,您可以使用名為sync.WaitGroup 的同步原語。 WaitGroup 允許您等待特定數量的 goroutine 完成。在這種情況下,您可以使用 WaitGroup 等待所有負責將值泵送到輸出通道的 goroutine 完成。只有在所有 goroutine 完成後,才應關閉輸出通道。
以下程式碼示範了使用WaitGroup 修改後的Mux 函數:
import ( "math/big" "sync" ) func Mux(channels []chan big.Int) chan big.Int { var wg sync.WaitGroup wg.Add(len(channels)) ch := make(chan big.Int, len(channels)) for _, c := range channels { go func(c <-chan big.Int) { for x := range c { ch <- x } wg.Done() }(c) } go func() { wg.Wait() close(ch) }() return ch }
透過使用WaitGroup,您可以確保輸出通道是僅當所有輸入通道都已處理完畢時才關閉,允許您以確定的順序接收來自所有輸入通道的所有值。
以上是如何提高通道多工器功能的效能並確保接收所有輸出值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!