Go:理解並解決「致命錯誤:所有goroutine 都在睡眠- 死鎖」
執行Go 程式時,遇到錯誤訊息「fatal error: all goroutine are sleep - deadlock」 表示程式的所有goroutine(輕量級執行緒)都被阻塞無限期地,導致死鎖。
在提供的程式碼中,由於「file1chan」通道的無緩衝性質而出現此問題。當一個值被傳送到一個無緩衝的通道時,如果沒有其他 goroutine 準備好接收它,它就會阻塞。在這種情況下,主 Goroutine 向“file1chan”發送值,但沒有任何並發 Goroutine 從中接收,從而導致死鎖。
解決方案1:引入並發模式
要解決死鎖,請引入一個單獨的並發Goroutine,它從“file1chan”接收值並避免阻塞主Goroutine 。使用goroutine 方法修改後的程式碼如下:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) go func() { for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan) }
解決方案2:使用緩衝通道
或者,您可以使用緩衝通道來處理固定數量的值而不導致死鎖。容量為 1 的緩衝通道足以完成此任務:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string, 1) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) print(file1chan) }
使用緩衝通道,即使接收者尚未準備好,發送者也可以繼續執行,從而避免死鎖。
以上是如何修復 Go 中的“致命錯誤:所有 goroutine 都在睡眠 - 死鎖”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!