Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menambah Masa Tamat pada WaitGroup.Wait() dalam Go?
Bosan Menunggu Selamanya? Menambahkan Tamat Masa pada WaitGroup.Wait()
Apabila anda menggunakan WaitGroup.Wait() untuk menyegerakkan gorouti dan memastikan ia selesai dilaksanakan, anda mungkin sekali-sekala menginginkan keupayaan untuk menamatkan menunggu selepas tempoh tertentu. Ini menghalang sistem anda daripada bergantung tanpa henti pada pekerja ingkar yang mungkin tidak pernah menyelesaikan tugas mereka.
Penyelesaian Pragmatik untuk Kumpulan Menunggu Bermasa
Satu pendekatan untuk melaksanakan tamat masa melibatkan penggunaan gabungan goroutine, saluran, dan pakej masa. Ideanya adalah untuk mencipta saluran yang menerima isyarat setelah selesai semua goroutine. Pada masa yang sama, pemasa dimulakan dengan tempoh tamat masa yang diingini. Pernyataan pilih digunakan untuk memantau kedua-dua saluran dan pemasa:
import ( "sync" "time" ) func task(wg *sync.WaitGroup) { // Perform some task... time.Sleep(time.Second * 2) wg.Done() } func main() { var wg sync.WaitGroup wg.Add(2) go task(&wg) go task(&wg) ch := make(chan struct{}) defer close(ch) go func() { defer wg.Done() wg.Wait() close(ch) }() timeout := 5*time.Second select { case <-ch: fmt.Println("All jobs completed within timeout.") case <-time.After(timeout): fmt.Println("Timeout reached, not all jobs completed.") } }
Memudahkan Masa Tamat dengan Fungsi Pembantu
Untuk menawarkan pendekatan yang lebih mudah dan boleh digunakan semula, pertimbangkan untuk mencipta fungsi pembantu yang merangkumi fungsi ini:
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 case <-time.After(timeout): return true } }
Fungsi pembantu ini menerima WaitGroup dan tempoh tamat masa yang diingini serta mengembalikan sama ada menunggu melebihi had yang ditentukan atau tidak.
Penggunaan Fungsi Pembantu
Menggunakan fungsi pembantu adalah mudah:
if waitTimeout(&wg, 5*time.Second) { fmt.Println("Timeout reached waiting for wait group.") }
Dalam contoh ini, fungsi waitTimeout kembali benar jika kumpulan menunggu mengambil masa lebih lama daripada 5 saat untuk selesai, menunjukkan bahawa tamat masa telah berlaku.
Atas ialah kandungan terperinci Bagaimana untuk Menambah Masa Tamat pada WaitGroup.Wait() dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!