Tamat masa untuk WaitGroup.Wait()
WaitGroup.Wait() boleh menyekat selama-lamanya, menunggu semua goroutine selesai. Ini boleh menjadi masalah apabila anda ingin melindungi sistem anda daripada pekerja sesat yang berpotensi menghalang pelaksanaan selama-lamanya. Walaupun tiada cara idiomatik untuk menetapkan tamat masa untuk WaitGroup.Wait(), terdapat beberapa pendekatan untuk mencapai fungsi ini.
Satu pendekatan biasa melibatkan penggunaan saluran dan goroutine. Apabila goroutine menyelesaikan kerjanya, ia menghantar isyarat ke saluran. Program utama boleh memilih pada saluran dan pemasa untuk menentukan sama ada goroutine tamat masa. Berikut ialah contoh:
import ( "sync" "time" ) func main() { var wg sync.WaitGroup wg.Add(1) timeout := time.After(5 * time.Second) ch := make(chan struct{}) go func() { defer wg.Done() defer close(ch) // Do some work }() select { case <-ch: // Goroutine finished before timeout wg.Wait() // Wait for all goroutines to finish case <-timeout: // Goroutine timed out wg.Wait() // Block until all goroutines have completed log.Println("Timeout occurred") } }
Penyelesaian ini menggunakan pernyataan pilihan untuk menunggu sama ada pada saluran atau pemasa, menyediakan mekanisme tamat masa untuk WaitGroup.Wait(). Pengoptimuman lain yang disyorkan termasuk menggunakan penyataan tangguh untuk menutup saluran dan menggunakan pemalar yang tidak ditaip untuk tempoh tamat masa.
Sebagai alternatif, anda boleh menggunakan fungsi pembantu tersuai yang membungkus fungsi di atas, memudahkan kod dan menjadikannya lebih boleh digunakan semula. Berikut ialah contoh:
func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool { c := make(chan struct{}) defer close(c) go func() { wg.Wait() c <- struct{}{} }() select { case <-c: return false // Completed normally case <-time.After(timeout): return true // Timed out } }
Fungsi ini boleh digunakan seperti berikut:
if waitTimeout(&wg, 5*time.Second) { fmt.Println("Timed out waiting for wait group") } else { fmt.Println("Wait group finished") }
Pendekatan ini menyediakan cara untuk menetapkan tamat masa untuk WaitGroup.Wait(), membolehkan anda melindungi sistem anda daripada pekerja sesat menyekat pelaksanaan selama-lamanya.
Atas ialah kandungan terperinci Bagaimana untuk Menetapkan Tamat Masa untuk WaitGroup.Wait() dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!