Rumah > pembangunan bahagian belakang > Golang > Pergi Buntu: Bagaimana untuk Mengelakkan Ralat 'semua goroutine sedang tidur'?

Pergi Buntu: Bagaimana untuk Mengelakkan Ralat 'semua goroutine sedang tidur'?

Linda Hamilton
Lepaskan: 2024-12-27 13:06:18
asal
836 orang telah melayarinya

Go Deadlocks: How to Avoid the

Kebuntuan dalam Pergi: "lempar: semua gorouti sedang tidur"

Kebuntuan goroutine berlaku apabila semua goroutine yang sedang berjalan menunggu antara satu sama lain untuk lengkap. Dalam kod Go yang disediakan, kebuntuan timbul disebabkan saluran ch yang tidak ditutup.

Jumlah fungsi terus menunggu nilai baharu pada saluran ch menggunakan gelung julat. Oleh kerana saluran ch tidak pernah ditutup, gelung tidak akan ditamatkan. Ini bermakna goroutine yang bertanggungjawab untuk melaksanakan fungsi ini tidak akan pernah selesai.

Sementara itu, dalam fungsi utama, program cuba menghantar nilai ke saluran ch dan menerima hasilnya. Walau bagaimanapun, memandangkan jumlah goroutine sedang menunggu selama-lamanya, ia tidak dapat memproses nilai yang dihantar dan menghantar semula hasilnya. Ini menyebabkan program buntu.

Untuk menyelesaikan kebuntuan ini, saluran ch mesti ditutup selepas menghantar semua nilai. Ini akan menandakan jumlah fungsi untuk berhenti menunggu nilai baharu dan mengira hasilnya.

Berikut ialah versi kod yang diubah suai dengan penutupan saluran:

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

Sekarang, jumlah goroutine berjalan akan melakukan penjumlahan dengan betul dan menghantar hasilnya kembali ke utama, mengelakkan kebuntuan.

Atas ialah kandungan terperinci Pergi Buntu: Bagaimana untuk Mengelakkan 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan