在等待上下文取消时执行代码



假设我有一堆goroutine正在运行,它们执行HTTP请求并将在随机时间返回。我启动了goroutines(有等待组,其中有一个取消(,我希望它们继续执行请求,直到它返回OK(可能会超时(。当第一个返回时,它调用取消,其他每个goroutine都应该停止。

我不确定如何设置在没有完成上下文的情况下执行代码的 goroutine 函数案例?

例如,我知道如何使用time.After()但是如何使其立即执行代码而不是在持续时间后执行?

for {
select {
case <-ctx.Done():
wg.Done()
return
case <-time.After(time.Second):
// code goes here
}
}

我可以用什么替换时间案例?

如果我理解正确,您有多个 goroutines 竞相计算同一请求的结果。我相信你正在寻找这样的东西:

for {
select {
case <-ctx.Done():
wg.Done()
return
default:
}
// Do stuff
}

如果未取消上下文,则选择将立即降至默认值。但是,在运行代码时,上下文仍可能取消,因此最终可能会有多个 goroutines 尝试编写结果,因此您也必须同步它。您可以将结果写入频道,收到结果后,您可以取消上下文。但是,您可能仍有 goroutines 等待写入该通道,因此您必须继续从通道读取,直到所有 goroutines 终止。

最新更新