WaitGroup.Wait() 超時
WaitGroup.Wait() 可以無限期阻塞,等待所有 goroutine 完成。當您想要保護系統免受可能無限期阻止執行的錯誤工作人員影響時,這可能會出現問題。雖然沒有慣用的方法來為 WaitGroup.Wait() 設定超時,但有多種方法可以實現此功能。
一種常見的方法涉及使用通道和 goroutine。當 goroutine 完成工作時,它會向通道發送訊號。主程式可以選擇通道和定時器來確定 goroutine 是否逾時。以下是範例:
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") } }
此解法使用 select 語句在頻道或計時器上等待,為 WaitGroup.Wait() 提供逾時機制。其他建議的最佳化包括使用 defer 語句來關閉通道以及使用無類型常數來設定逾時持續時間。
或者,您可以使用包裝上述功能的自訂輔助函數,從而簡化程式碼並使其更可重複使用。以下是一個範例:
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 } }
此函數可以如下使用:
if waitTimeout(&wg, 5*time.Second) { fmt.Println("Timed out waiting for wait group") } else { fmt.Println("Wait group finished") }
這些方法提供了一種為WaitGroup.Wait() 設定超時的方法,讓您保護您的系統不會被錯誤的工作人員無限期地阻止執行。
以上是如何在 Go 中設定 WaitGroup.Wait() 逾時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!