Rumah > pembangunan bahagian belakang > Golang > Cara Menyelesaikan \'Ralat Maut: Semua Goroutine Tidur - Kebuntuan!\' dalam Pergi Apabila Menggunakan Saluran Tidak Dibuffer?

Cara Menyelesaikan \'Ralat Maut: Semua Goroutine Tidur - Kebuntuan!\' dalam Pergi Apabila Menggunakan Saluran Tidak Dibuffer?

Barbara Streisand
Lepaskan: 2024-11-25 15:36:17
asal
750 orang telah melayarinya

 How to Resolve

"Pergi: Ralat Maut: Semua Goroutine Tidur - Buntu"

Masalah:

Anda mempunyai fail teks dengan satu baris perkataan dan anda cuba menyimpan setiap perkataan dalam saluran. Selepas itu, anda ingin mendapatkan semula perkataan ini daripada saluran dan mencetaknya satu demi satu. Coretan kod berikut mewakili pendekatan semasa anda:

package main

import (
    "bufio"
    "fmt"
    "os"
)

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

Walau bagaimanapun, semasa menjalankan kod ini, anda menemui mesej ralat: "ralat maut: semua gorouti sedang tidur - kebuntuan!"

Penyelesaian:

Ralat timbul kerana file1chan anda ialah saluran yang tidak dibuffer. Apabila anda cuba menghantar nilai ke saluran ini, saluran ini disekat selama-lamanya, menunggu penerima. Untuk menyelesaikan kebuntuan ini, anda boleh sama ada memulakan goroutine baharu yang bertanggungjawab untuk menghantar nilai ke saluran atau mengisytiharkan saluran sebagai penimbal. Dua pendekatan digariskan di bawah:

Menggunakan Goroutine Baharu:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)

    // Start a new goroutine to send strings down file1chan
    go func() {
        for scanner.Scan() {
            line := scanner.Text()
            parts := strings.Fields(line)

            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan) // Close the channel when done sending.
    }()

    print(file1chan) // Read strings from file1chan
}

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

Menggunakan Saluran Buffer:

Untuk mengendalikan rentetan tunggal, anda boleh menentukan saluran penimbal bersaiz 1:

package main

import (
    "bufio"
    "fmt"
    "os"
)

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()
        parts := strings.Fields(line)

        for i := range parts {
            file1chan <- parts[i]
        }
    }

    close(file1chan) // Close the channel when done sending.
    print(file1chan)
}

func print(in <-chan string) {
    for str := range in { // Read all values until channel gets closed
        fmt.Printf("%s\n", str)
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Cara Menyelesaikan \'Ralat Maut: Semua Goroutine Tidur - Kebuntuan!\' dalam Pergi Apabila Menggunakan Saluran Tidak Dibuffer?. 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