Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyelesaikan Ralat \'Semua Goroutine Tidur - Kebuntuan\' dalam Go?

Bagaimana untuk Menyelesaikan Ralat \'Semua Goroutine Tidur - Kebuntuan\' dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-23 10:16:11988semak imbas

How to Resolve the

Go: Fatal Error "All Goroutines Are Sleep - Deadlock" Dijelaskan

Dalam Go, menghantar ke saluran tidak buffer menghalang pengirim sehingga penerima tersedia. Dalam kod yang disediakan, goroutine yang bertanggungjawab untuk menghantar perkataan ke saluran file1chan ialah satu-satunya goroutine dan tiada penerima. Akibatnya, pengirim disekat selama-lamanya, membawa kepada jalan buntu.

Penyelesaian Menggunakan Goroutine Baharu:

Satu penyelesaian ialah mencipta goroutine berasingan untuk mengendalikan penghantaran perkataan. Goroutine ini tidak akan menyekat goroutine utama dan membenarkan pelaksanaan serentak.

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    go func() { // start a new goroutine that sends strings down file1chan 
        for scanner.Scan() {
            line := scanner.Text()

            // Split the line on a space
            parts := strings.Fields(line)

            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    print(file1chan) // read strings from file1chan
}

Penyelesaian Menggunakan Saluran Penampan:

Penyelesaian lain ialah mencipta saluran penimbal, yang membolehkan berbilang nilai dihantar dan diterima serentak. Untuk masalah yang diberikan, saiz penimbal sebanyak satu sudah memadai.

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string, 1) // buffer size of one
    for scanner.Scan() {
        line := scanner.Text()

        // Split the line on a space
        parts := strings.Fields(line)

        for i := range parts {
            file1chan <- parts[i]
        }
    }
    close(file1chan) // we're done sending to this channel now, so we close it.
    print(file1chan)
}

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat \'Semua Goroutine Tidur - Kebuntuan\' dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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