具有平等存取權的通道多路復用器
這個Go 多路復用器旨在將多個通道的輸出合併為一個,確保每個輸入通道都有輸出通道的平等權利。然而,提供的測試給出了意想不到的結果。
問題分析
關鍵問題在於 Mux 函數產生的 goroutine。通道參數 c 旨在表示每個輸入通道,在循環的每次迭代中都會更新。這意味著所有 goroutine 最終都會從同一個通道拉取,而不是它們預期的各個通道。
解決方案
要解決此問題,請將goroutine 建立循環修改為通過每個goroutine 的正確通道:
for _, c := range channels { go func(c <-chan big.Int) { ... }(c) }
透過每個goroutine 的正確通道:
透過每個goroutine 的正確通道:
透過每個goroutine 的正確通道:
通過這樣做,每個goroutine 在以下情況下捕獲通道的值:它被創建,消除了問題並產生了期望的結果。import ( "math/big" "sync" ) // ... other code ... // The channel to output to. ch := make(chan big.Int, len(channels)) var wg sync.WaitGroup wg.Add(len(channels)) // ... other code ... // Close the channel when the pumping is finished. go func() { // Wait for everyone to be done. wg.Wait() // Close. close(ch) }()
以上是Go 多工器如何確保多個輸入通道的公平和安全存取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!