Rumah > pembangunan bahagian belakang > Golang > Mengapakah program Go menghadapi \'ralat maut: semua gorouti sedang tidur - kebuntuan!\' dan bagaimanakah ia boleh dibetulkan?

Mengapakah program Go menghadapi \'ralat maut: semua gorouti sedang tidur - kebuntuan!\' dan bagaimanakah ia boleh dibetulkan?

Patricia Arquette
Lepaskan: 2024-11-17 02:23:03
asal
236 orang telah melayarinya

Why do Go programs encounter the

Go: Deadlock Panic - Memahami Punca dan Membetulkannya

Dalam Go, ralat biasa yang dihadapi ialah "ralat maut: semua goroutine adalah tidur - kebuntuan!" apabila cuba menguruskan komunikasi antara goroutine. Ralat ini timbul apabila goroutine tersekat dalam keadaan di mana mereka semua menunggu antara satu sama lain untuk meneruskan.

Pernyataan Masalah

Pertimbangkan kod berikut yang ingin anda baca sebaris perkataan daripada fail teks, simpannya dalam saluran, dan kemudian cetaknya secara individu:

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    for scanner.Scan() {
        line := scanner.Text()
        parts := strings.Fields(line)
        for i := range parts {
            file1chan <- parts[i]
        }
    }
    print(file1chan)
}

func print(in <-chan string) {
    for str := range in {
        fmt.Printf("%s\n", str)
    }
}
Salin selepas log masuk

Punca Kebuntuan

Setelah menjalankan kod ini, anda menghadapi ralat kebuntuan. Ini berlaku kerana fail1chan saluran tidak dibuffer. Akibatnya, apabila anda cuba menghantar nilai ke dalam saluran, ia menyekat selama-lamanya, menunggu penerima.

Membetulkan Kebuntuan

Untuk menyelesaikan kebuntuan, anda mempunyai dua pilihan:

  1. Gunakan Buffered Saluran:
    Anda boleh mencipta saluran penimbal dengan menyatakan saiznya sebagai hujah kedua untuk dibuat(chan), seperti ini:

    file1chan := make(chan string, 1) // buffer size of one
    Salin selepas log masuk

    Saluran penimbal bertindak seperti tatasusunan, di mana penghantar boleh menghantar nilai tanpa menyekat jika saluran mempunyai kapasiti yang tersedia.

  2. Gunakan yang Baharu Goroutine:
    Anda boleh memulakan goroutine baharu untuk menghantar nilai ke saluran tanpa buffer:

    file1chan := make(chan string)
    go func() { // start a new goroutine that sends strings down file1chan
        for scanner.Scan() {
            line := scanner.Text()
            parts := strings.Fields(line)
            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    
    print(file1chan)
    Salin selepas log masuk

    Dengan pendekatan ini, goroutine baharu memikul tanggungjawab menghantar nilai, manakala goroutine utama memfokuskan semasa mencetaknya.

Dengan melaksanakan salah satu daripada ini penyelesaian, anda menghapuskan kebuntuan dengan berkesan dan membolehkan komunikasi lancar antara gorouti anda.

Atas ialah kandungan terperinci Mengapakah program Go menghadapi \'ralat maut: semua gorouti sedang tidur - kebuntuan!\' dan bagaimanakah ia boleh dibetulkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan