Menunggu Saluran Penimbalan untuk Disahkan
Dalam kod yang disediakan, saluran penimbal digunakan sebagai semafor untuk mengehadkan bilangan serentak menjalankan goroutines. Walau bagaimanapun, tanpa mekanisme yang jelas untuk menunggu saluran mengalir, program utama mungkin ditamatkan sebelum semua gorout selesai dilaksanakan.
Masalah:
Bagaimana untuk memastikan bahawa program menunggu semua goroutine selesai sebelum ini keluar?
Jawapan:
Menggunakan semaphore (saluran) untuk tujuan ini tidak sesuai kerana tiada cara terbina dalam untuk menyemak panjang saluran dan menunggu ia mencapai 0. Untuk menunggu gorouti dengan betul selesai, pertimbangkan untuk menggunakan primitif penyegerakan seperti sync.WaitGroup.
Kod Kemas Kini:
sem := make(chan struct{}, 2) var wg sync.WaitGroup for _, i := range ints { wg.Add(1) // acquire semaphore sem <- struct{}{} // start long running go routine go func(id int) { defer wg.Done() // do something // release semaphore <-sem }(i) } wg.Wait()
Segerakan.WaitGroup mengekalkan kiraan tugas yang belum selesai (goroutine dalam kes ini) . Ini membolehkan program utama menunggu sehingga semua tugasan selesai. wg.Add(1) menambah kiraan tugas sebelum memulakan goroutine baharu dan wg.Done() mengurangkan kiraan apabila goroutine selesai. Panggilan wg.Wait() menyekat program utama sehingga kiraan tugasan mencapai 0, memastikan semua goroutine telah selesai sebelum program keluar.
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Semua Goroutine Lengkap Sebelum Program Keluar Apabila Menggunakan Saluran Penampan sebagai Semaphore?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!