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

Go 在等待上下文取消时执行代码,go,goroutine,Go,Goroutine,假设我有一组goroutine正在运行,它们执行HTTP请求,并将在随机时间返回。我启动goroutines(其中有一个waitgroups和一个cancel),希望它们继续执行请求,直到返回OK(可能超时)。当第一个goroutine返回时,它调用cancel,其他goroutine应该停止 我不确定如何设置goroutine函数,如果上下文未完成,它将执行代码 例如,我知道如何使用time.After(),但如何使其立即执行代码,而不是在持续时间之后执行 for { sele

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

我不确定如何设置goroutine函数,如果上下文未完成,它将执行代码

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

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

case如果我理解正确,您会有多个goroutine竞相计算同一请求的结果。我相信您正在寻找类似以下内容:

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

是的。第一个得到结果的goroutine将调用其他goroutine的cancel。我想我们遇到的问题是,只有在HTTP请求返回时(完成、超时等)才会检查cancel。如果不读取通道,则无法检查通道是否已满?为了防止必须向通道中写入多个内容,您应该在接收端执行取消操作,即,当等待的goroutine接收到第一个结果时。取消后,它仍应从该通道读取,直到所有其他goroutine让我们终止,否则你会泄露的