Rumah > pembangunan bahagian belakang > Golang > Pergi Buntu: Mengapa 'membuang: semua goroutine sedang tidur' Berlaku?

Pergi Buntu: Mengapa 'membuang: semua goroutine sedang tidur' Berlaku?

Mary-Kate Olsen
Lepaskan: 2025-01-02 15:03:39
asal
558 orang telah melayarinya

Go Deadlock: Why Does

Kebuntuan dalam Go: "lempar: semua goroutin sedang tidur"

Dalam program Go, kebuntuan berlaku apabila dua atau lebih gorout menunggu untuk menyelesaikan satu sama lain, mengakibatkan keadaan beku di mana tiada kemajuan boleh dibuat. Isu ini sering dilaporkan sebagai "buang: semua goroutine sedang tidur - kebuntuan!"

Mari kita analisa program Go yang dipermudahkan untuk memahami mengapa kebuntuan ini berlaku:

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

Dalam program ini, fungsi jumlah mengira jumlah nombor yang dihantar melalui saluran ch dan menghantar hasilnya semula pada saluran yang sama. Kebuntuan timbul kerana syarat berikut dipenuhi:

  • Jumlah fungsi menyekat di dalam gelung for menunggu lebih banyak input melalui ch (dengan kata kunci julat).
  • Fungsi utama menghantar tiga nilai kepada ch tetapi tidak menutup saluran.
  • Memandangkan jumlah fungsi masih menunggu untuk lebih banyak input, ia tidak menghantar keputusan semula ch.
  • Fungsi utama menyekat di baris fmt.Println menunggu hasil daripada ch.

Ini mewujudkan situasi buntu di mana kedua-dua goroutin (yang menjalankan jumlah dan satu utama) sedang menunggu yang lain untuk bertindak, membawa kepada ralat "buang: semua goroutine sedang tidur".

Untuk menyelesaikan kebuntuan ini, kita boleh menutup saluran ch dalam fungsi utama selepas menghantar nilai terakhir:

ch <- 3
close(ch)
Salin selepas log masuk

Menutup isyarat saluran kepada jumlah goroutine bahawa tiada lagi input, membolehkan ia melengkapkan pengiraannya dan hantarkan semula keputusan pada ch.

Atas ialah kandungan terperinci Pergi Buntu: Mengapa 'membuang: semua goroutine sedang tidur' Berlaku?. 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