Tunggu Bermasa untuk WaitGroup.Wait()
Dalam Go, jenis WaitGroup digunakan untuk menyegerakkan berbilang goroutin sehingga semua menyelesaikan tugas mereka . Kaedah WaitGroup.Wait() menyekat sehingga semua ahli kumpulan telah memberi isyarat bahawa mereka telah selesai atau konteksnya dibatalkan.
Walau bagaimanapun, kadangkala wajar untuk mengenakan tamat masa pada operasi tunggu WaitGroup, untuk mengelakkan penjadual daripada menunggu pekerja yang sesat selama-lamanya. Ini membuka persoalan falsafah tentang kebolehpercayaan dan kebolehpulihan sistem dengan kehadiran ralat sedemikian, tetapi perbincangan ini di luar skop soalan ini.
Penyelesaian
Penyelesaian yang disediakan menggunakan saluran dan pernyataan pilihan untuk mencapai kefungsian tamat masa:
c := make(chan struct{}) go func() { defer wg.Done() // Do the work c <- struct{}{} }() select { case <-c: // Work completed case <-time.After(timeout): // Timed out }
Penyelesaian ini berkesan, tetapi ia mungkin kelihatan terlalu berbelit-belit. Petua berikut boleh memperbaikinya:
Fungsi Pembantu
Untuk memudahkan proses, fungsi pembantu boleh dibuat untuk merangkum logik tamat masa:
func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool { c := make(chan struct{}) go func() { defer close(c) wg.Wait() }() select { case <-c: return false // Completed normally case <-time.After(timeout): return true // Timed out } }
Fungsi ini membungkus fungsi tamat masa dan memudahkannya gunakan:
if waitTimeout(&wg, time.Second) { fmt.Println("Timed out waiting for wait group") } else { fmt.Println("Wait group finished") }
Pendekatan ini menyediakan cara yang lebih bersih dan mudah untuk mengendalikan tamat masa untuk operasi WaitGroup.Wait().
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Tunggu Bermasa untuk WaitGroup.Wait() dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!