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中文网其他相关文章!