Rumah > pembangunan bahagian belakang > Golang > Mengapa My Go Program Deadlock dengan Ralat 'semua goroutine sedang tidur'?

Mengapa My Go Program Deadlock dengan Ralat 'semua goroutine sedang tidur'?

DDD
Lepaskan: 2024-12-23 02:11:14
asal
906 orang telah melayarinya

Why Does My Go Program Deadlock with the

Go Program buntu: "lempar: semua goroutine sedang tidur"

Dalam program Go, kebuntuan berlaku apabila dua atau lebih goroutin ( serentak menjalankan fungsi) menunggu selama-lamanya untuk satu sama lain selesai. Satu situasi sedemikian boleh timbul apabila bekerja dengan saluran, seperti yang dilihat dalam program berikut:

package main

import (
    "fmt"
)

func total(ch chan int) {
    res := 0
    for iter := range ch {
        res += iter
    }
    ch <- res
}

func main() {
    ch := make(chan int)
    go total(ch)
    ch <- 1
    ch <- 2
    ch <- 3
    fmt.Println("Total is ", <-ch)
}
Salin selepas log masuk

Menjalankan program ini akan mengakibatkan mesej panik:

throw: all goroutines are asleep - deadlock!
Salin selepas log masuk

Punca perkara ini kebuntuan terletak pada fakta bahawa jumlah goroutine cuba menghantar nilai kembali ke saluran yang sama yang ia terima daripada (ch). Oleh kerana saluran tidak ditutup (penyelesaian isyarat), gelung julat dalam jumlah goroutine akan diteruskan selama-lamanya, menyekat sebarang penghantaran atau penerimaan selanjutnya.

Untuk menyelesaikan isu ini, kami boleh memperkenalkan saluran lain untuk menerima hasilnya. Berikut ialah program yang dikemas kini:

package main

import (
    "fmt"
)

func total(in chan int, out chan int) {
    res := 0
    for iter := range in {
        res += iter
    }
    out <- res // Send result on separate channel
}

func main() {
    ch := make(chan int)
    rch := make(chan int) // New channel to receive result
    go total(ch, rch)
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch) // Explicitly close channel to end loop in `total`
    result := <-rch // Wait for result on `rch`
    fmt.Println("Total is ", result)
}
Salin selepas log masuk

Dengan menghantar keputusan pada saluran berasingan dan menutup saluran asal, kami memecahkan kebuntuan dan membenarkan goroutine utama menerima jumlah yang dikira.

Atas ialah kandungan terperinci Mengapa My Go Program Deadlock dengan Ralat 'semua goroutine sedang tidur'?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan