WaitGroup.Wait() 超时:惯用方法
在 Go 中,可以为 WaitGroup.Wait() 设置时间限制,以防止无限等待错误的工作线程。以下是对实现它的惯用方法和替代方法的详细探索。
推荐解决方案:使用计时器和通道
以下方法被广泛认为是最惯用的解决方案:
- 创建一个通道 (c) 以在等待组完成等待时发出信号。
- 生成一个 goroutine 来调用 wg.Wait() 并在完成时关闭通道。
- select 语句侦听要关闭的通道或发生超时。
- 如果通道关闭,函数返回 false,表示正常完成。
- 如果达到超时,函数返回 true,表示超时。
简化推荐的解决方案
为了更简单的实现,请考虑以下内容:
- 关闭通道以发出完成信号,而不是发送值。
- 即使函数提前终止,也可以使用 defer 来关闭通道。
- 如果只需要等待一个作业,请删除等待组.
- 直接使用持续时间而不进行转换(例如,time.Second)。
替代方法:使用可取消上下文
另一种方法涉及使用可取消的上下文context:
- 创建了一个可取消的上下文 (ctx)。
- 通道 (ctxDone) 用于在上下文被取消时发出信号。
- 生成一个 goroutine 来等待等待组并向 ctxDone 通道发出信号。
- select 语句侦听要取消的上下文或等待组完成。
- 如果上下文是取消,函数根据等待组是否已经完成等待而返回。
以上是如何在 Go 中实现 WaitGroup.Wait() 超时?的详细内容。更多信息请关注PHP中文网其他相关文章!