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