Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menyelesaikan Kebuntuan Go Concurrency: 'semua goroutine sedang tidur'?

Bagaimana untuk Menyelesaikan Kebuntuan Go Concurrency: 'semua goroutine sedang tidur'?

Mary-Kate Olsen
Lepaskan: 2024-12-28 13:31:13
asal
908 orang telah melayarinya

How to Resolve Go Concurrency Deadlocks:

Ralat Deadlock dalam Concurrency: "lempar: Semua Goroutines Tidur"

Apabila bekerja dengan concurrency dalam Go, kebuntuan boleh berlaku jika semua goroutines sedang menunggu antara satu sama lain untuk melakukan aksi. Satu ralat biasa yang dikaitkan dengan isu ini ialah "buang: semua goroutine sedang tidur - kebuntuan!"

Memahami Masalah

Pertimbangkan program Go 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

Apabila menjalankan program ini, kami menghadapi ralat "buang: semua goroutine sedang tidur - kebuntuan!" Sebabnya ialah gelung julat dalam jumlah fungsi tidak akan keluar kerana kami tidak pernah menutup saluran ch. Akibatnya, goroutine menunggu untuk menerima keputusan dalam fungsi utama tidak akan menerimanya.

Menyelesaikan Kebuntuan

Untuk menyelesaikan kebuntuan ini, kita perlu menutup saluran ch untuk menunjukkan bahawa tiada lagi nilai akan dihantar. Selain itu, kami boleh menggunakan saluran yang berasingan untuk menghantar balik hasil, menghalang penghantaran dan penerimaan terus pada saluran yang sama.

Program yang disemak di bawah menangani isu ini:

package main

import (
    "fmt"
)

func total(in chan int, out chan int) {
    res := 0
    for iter := range in {
        res += iter
    }
    out <- res // sends back the result
}

func main() {
    ch := make(chan int)
    rch := make(chan int)
    go total(ch, rch)
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch) // this will end the loop in the total function
    result := <-rch // waits for total to give the result
    fmt.Println("Total is ", result)
}
Salin selepas log masuk

Dengan menutup saluran ch dan menggunakan saluran rch yang berasingan untuk hasilnya, kami menghapuskan kebuntuan dan membenarkan program untuk dilaksanakan dengan betul.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kebuntuan Go Concurrency: 'semua goroutine sedang tidur'?. 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