Menyelesaikan Kebuntuan Goroutines
Dalam senario ini, anda telah mengalami ralat jalan buntu dalam kod serentak Go anda. Mari kita mendalami isu ini dan menyediakan penyelesaian yang cekap.
Ralat berlaku disebabkan oleh ketidakpadanan antara gelagat pengeluar dan pengguna anda. Pengeluar anda, yang dilaksanakan dalam fungsi pengeluar, menghantar nilai pada saluran ch untuk tempoh terhad. Walau bagaimanapun, pengguna, yang hadir dalam fungsi utama anda, berjalan selama-lamanya, tanpa henti cuba menerima nilai daripada ch.
Untuk menyelesaikan kebuntuan ini, anda perlu memastikan bahawa pengguna menghormati penyempurnaan pengeluar. Ini bermakna pengguna harus ditamatkan secara automatik apabila pengeluar selesai menghantar nilai.
Satu pendekatan yang berkesan ialah menggunakan penyegerakan.WaitGroup untuk menyelaraskan pengeluar. Kumpulan menunggu membolehkan anda menjejaki kemajuan pengeluar dan menunggu mereka menyelesaikan tugas mereka sebelum menutup saluran. Berikut ialah versi kod anda yang dipertingkatkan:
<code class="go">func main() { var wg sync.WaitGroup ch := make(chan int) wg.Add(1) go producer(ch, 100*time.Millisecond, 2, &wg) wg.Add(1) go producer(ch, 200*time.Millisecond, 5, &wg) // Start a goroutine to close the channel when all producers are done go func() { wg.Wait() close(ch) }() // Use a for range loop to receive values from the channel for v := range ch { fmt.Println(v) } }</code>
Dalam kod yang dikemas kini ini, sync.WaitGroup digunakan untuk menjejaki bilangan pengeluar aktif. Pengeluar memanggil wg.Done() untuk mengurangkan kumpulan menunggu apabila mereka selesai menghantar nilai. Goroutine utama menunggu untuk semua pengeluar selesai menggunakan wg.Wait(), dan kemudian menutup saluran ch.
Dengan menggunakan sync.WaitGroup, anda mewujudkan mekanisme penyelarasan yang membolehkan pengguna anda menghormati status penyiapan daripada pengeluar, dengan berkesan menyelesaikan ralat kebuntuan.
Atas ialah kandungan terperinci Bagaimana untuk Mencegah Kebuntuan dalam Go Concurrency dengan sync.WaitGroup?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!