Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memastikan Semua Goroutine Selesai Apabila Menggunakan Saluran Penampan sebagai Semaphore?
Menunggu Kekosongan Saluran Penimbal Menggunakan WaitGroup
Dalam pengaturcaraan serentak, selalunya perlu mengawal bilangan goroutin yang dilaksanakan secara serentak. Pendekatan biasa ialah menggunakan saluran buffered sebagai semaphore. Walau bagaimanapun, adalah penting untuk mengambil perhatian batasan pendekatan ini.
Pertimbangkan contoh berikut:
ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} sem := make(chan struct{}, 2) for _, i := range ints { sem<- struct{}{} go func(id int, sem chan struct{}) { // do something <-sem }(i, sem) }
Kod ini menggunakan saluran penimbal (sem) saiz 2 untuk mengehadkan bilangan serentak goroutine hingga 2. Walau bagaimanapun, terdapat masalah: program mungkin tamat sebelum beberapa goroutin terakhir menyelesaikan tugas mereka. Ini kerana saluran penimbal boleh menjadi kosong pada bila-bila masa semasa pemprosesan, walaupun semasa program menghantar lebih banyak goroutine.
Untuk menunggu saluran penimbal mengalir, kita tidak boleh bergantung pada saluran itu sendiri. Sebaliknya, kami boleh menggunakan penyegerakan.WaitGroup untuk menjejaki bilangan goroutin yang belum selesai:
sem := make(chan struct{}, 2) var wg sync.WaitGroup for _, i := range ints { wg.Add(1) sem<- struct{}{} go func(id int) { defer wg.Done() // do something <-sem }(i) } wg.Wait()
Dalam kod yang diubah suai ini, kami menggunakan wg.Add(1) untuk menambah kumpulan tunggu sebelum menghantar setiap goroutine. Pernyataan tangguh wg.Done() kemudian mengurangkan kumpulan tunggu apabila goroutine menyelesaikan tugasnya. Akhir sekali, wg.Wait() menyekat sehingga kumpulan tunggu mencapai sifar, memastikan semua goroutine telah selesai dilaksanakan. Pendekatan ini membolehkan kami menunggu sehingga saluran mengalir dan memastikan program tidak ditamatkan sebelum waktunya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memastikan Semua Goroutine Selesai Apabila Menggunakan Saluran Penampan sebagai Semaphore?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!