Dalam pengaturcaraan serentak, adalah penting untuk mengawal bilangan goroutin yang dilaksanakan secara serentak. Satu pendekatan ialah menggunakan saluran buffered sebagai semaphore. Walau bagaimanapun, isu biasa timbul apabila menunggu semaphore mengalir sepenuhnya.
Katakanlah kita mempunyai sepotong integer yang ingin kita proses serentak, dengan had dua serentak pergi rutin. Kami menggunakan saluran penimbal sebagai semafor untuk menguatkuasakan had ini. Walaupun kod berfungsi untuk kebanyakan integer, atur cara keluar lebih awal sebelum rutin pergi terakhir tamat kerana penimbal tidak pernah mencapai kekosongan.
Bagaimanakah kita menunggu saluran penimbal untuk longkang sepenuhnya, memastikan semua rutin pergi selesai sebelum program keluar?
Menggunakan saluran untuk menunggu keadaan tertentu tidak boleh dilaksanakan kerana kekurangan cara bebas perlumbaan untuk menyemak panjangnya. Sebaliknya, kami boleh menggunakan penyegerakan.WaitGroup untuk memantau penyiapan semua gorouti.
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()
Dengan menggunakan sync.WaitGroup, kita boleh menunggu sehingga semua gorout selesai sebelum program keluar, memastikan semua pemprosesan selesai.
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Semua Goroutine Lengkap Apabila Menggunakan Saluran Penampan sebagai Semaphore?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!