Mengapa saya mendapat - goroutine adalah ralat tidur kerana isu pengguna pengeluar

WBOY
Lepaskan: 2024-02-10 21:40:25
ke hadapan
976 orang telah melayarinya

为什么我会收到 - goroutines are sleeped 错误,因为生产者消费者问题

Editor PHP Youzi mungkin menghadapi mesej ralat biasa semasa menyelesaikan masalah pengaturcaraan: "goroutine sedang tidur". Ralat ini biasanya berkaitan dengan isu pengeluar-pengguna. Masalah pengeluar-pengguna ialah senario klasik dalam pengaturcaraan serentak, di mana satu atau lebih pengeluar menjana data dan satu atau lebih pengguna mengeluarkan data untuk diproses. Apabila pengeluar menjana data lebih pantas daripada pengguna boleh memproses data, ia boleh menyebabkan goroutine (benang ringan dalam bahasa Go) tertidur. Artikel ini akan menerangkan sebab ralat ini berlaku dan menyediakan penyelesaian.

Kandungan soalan

Ini ialah kod - pengeluar dan berbilang pengguna dalam rutin pergi. Pengeluar menyuntik maklumat ke dalam saluran, dan berbilang pengguna (masing-masing melalui rutin harian) harus membacanya secara selari.

func main() {
    alphabetArray := []string{"A", "B", "C"}

    alphabetChannel := make(chan string, 3)
    // producer.
    go func() {
        for _, alphabet := range alphabetArray {
            alphabetChannel <- alphabet
        }
    }()

    var wg sync.WaitGroup
    // spawn 10 consumers, consumers represented as a go-routine.
    for idx := 0; idx < 10; idx++ {
        wg.Add(1)
        go func() {
            for alphabet := range alphabetChannel {
                fmt.Println(alphabet)
            }
        }()
    }
    wg.Wait()
}
Salin selepas log masuk

Berikut ialah pautan ke taman permainan - https://go.dev/play/p/yndataeexpb

Ralat yang saya terima ialah ini -

Satu Kedua c Ralat maut: semua goroutine sedang tidur - kebuntuan!

Penyelesaian

Tutup saluran apabila pengeluar selesai supaya pengguna tahu bila hendak berhenti:

go func() {
        defer close(alphabetchannel)
        for _, alphabet := range alphabetarray {
            alphabetchannel <- alphabet
        }
    }()
Salin selepas log masuk

Beritahu kumpulan menunggu apabila pengguna selesai:

go func() {
            defer wg.Done()
            for alphabet := range alphabetChannel {
                fmt.Println(alphabet)
            }
        }()
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa saya mendapat - goroutine adalah ralat tidur kerana isu pengguna pengeluar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!