首頁  >  文章  >  後端開發  >  如何修復 Go 中的“致命錯誤:所有 goroutine 都在睡眠 - 死鎖”?

如何修復 Go 中的“致命錯誤:所有 goroutine 都在睡眠 - 死鎖”?

DDD
DDD原創
2024-11-18 07:41:02698瀏覽

How to Fix

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn