Kebuntuan dalam GoLang: Mengapa Julat Melepasi Saluran Penimbalan?
Apabila menggunakan saluran penimbal dalam GoLang, adalah penting untuk mengelak daripada mewujudkan situasi kebuntuan . Isu baru-baru ini menimbulkan kebimbangan tentang kebuntuan yang dihadapi semasa cuba menjangkau saluran penimbal selepas semua gorout selesai.
Kod yang disediakan cuba menggunakan saluran penimbal dengan kapasiti 4 dan menghasilkan 4 gorout yang menghantar data ke saluran. Walau bagaimanapun, jalan buntu berlaku kerana:
Penyelesaian 1: Kembangkan Saiz Saluran dan Tutup Selepas Selesai
Untuk menyelesaikan kebuntuan, saluran boleh ditambah saiz dan ditutup selepas semua goroutine selesai:
<code class="go">ch := make(chan []int, 5) ... wg.Wait() close(ch)</code>
Walau bagaimanapun, ini menghapuskan faedah saluran paip, kerana ia menghalang pencetakan sehingga semua tugasan selesai.
Penyelesaian 2: Penyelesaian Isyarat dari dalam Rutin Pencetakan
Untuk mendayakan saluran paip sebenar, fungsi Done() boleh dipanggil dalam rutin pencetakan:
<code class="go">func main() { ch := make(chan []int, 4) ... go func() { for c := range ch { fmt.Printf("c is %v\n", c) wg.Done() } }() ... }</code>
Pendekatan ini memastikan bahawa fungsi Done() hanya dipanggil selepas setiap elemen telah dicetak, dengan berkesan menandakan siapnya setiap goroutine.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebuntuan Apabila Bersiar-siar di Saluran Buffer dalam GoLang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!