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

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

Mary-Kate Olsen
Lepaskan: 2024-11-23 10:16:11
asal
1079 orang telah melayarinya

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
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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