通道多路復用器
問題:
嘗試建立一個通道多路復用器將多個通道的輸出合併為一個,程式設計師遇到意外行為並尋求以下指導問題:
答案:
程式碼使用for循環為每個通道創建 goroutine。然而,變數 c 在循環的每次迭代中都會更新,導致 goroutine 全部從相同通道讀取。要解決此問題,應將通道直接傳遞給goroutine:
for _, c := range channels { go func(c <-chan big.Int) { // ... }(c) }
程式碼初始化所有輸出值設定為“false”,導致僅列印false 值。這可以透過將行 fmt.Println(l) 替換為 fmt.Println(l.String()) 來解決。
餵食模式是由上述代碼中的錯誤引起的,其中goroutine 嘗試從同一通道讀取數據。上面的修復應該可以解決這個問題,並允許所有輸入通道的平衡輸出。
提供的多工器實作是一個基本的方法。對於需要更高效能或併發性的場景,替代選項可能會考慮透過通道或同步原語(如互斥體)傳遞訊息。
以上是如何有效地重複使用多個通道並避免意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!