定时等待 WaitGroup.Wait()
在 Go 中,WaitGroup 类型用于同步多个 goroutine,直到所有 goroutine 都完成任务。 WaitGroup.Wait() 方法会阻塞,直到该组的所有成员都发出完成信号或上下文被取消为止。
但是,有时需要对 WaitGroup 等待操作施加超时,以防止调度程序避免无限期地等待犯错的工人。这就提出了有关系统在出现此类错误时的可靠性和可恢复性的哲学问题,但这种讨论超出了本问题的范围。
解决方案
提供的解决方案利用通道和 select 语句来实现超时功能:
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 }
这个解决方案是有效的,但是它可能看起来过于复杂。以下提示可以改进它:
辅助函数
为了简化流程,可以创建一个辅助函数来封装超时逻辑:
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 } }
这个函数封装了超时功能,并且可以很容易地使用:
if waitTimeout(&wg, time.Second) { fmt.Println("Timed out waiting for wait group") } else { fmt.Println("Wait group finished") }
这种方法提供了一种更干净、更方便的方法来处理 WaitGroup.Wait() 操作的超时。
以上是如何在Go中实现WaitGroup.Wait()的定时等待?的详细内容。更多信息请关注PHP中文网其他相关文章!