当一个发生错误时,如何停止另一个?
我必须使用res1和res2,在生产版res1中,res2不是相同的静态类型。
package main
import (
"fmt"
"net/http"
"sync"
)
func main() {
wg := &sync.WaitGroup{}
wg.Add(2)
var res1, res2 *http.Response
var err1, err2 error
go func() {
defer wg.Done()
res1, err1 = http.Get("http://127.0.0.1:8899")
if err1 != nil {
panic(err1)
}
}()
go func() {
defer wg.Done()
res2, err2 = http.Get("http://127.0.0.1:8898")
if err2 != nil {
panic(err2)
}
}()
wg.Wait()
fmt.Println(res1, res2)
}
答案 0 :(得分:4)
公共上下文应该能够取消所有等待的请求。像这样:
ctx, cancel:=context.WithCancel(context.Background())
defer cancel()
cli:=http.Client{}
go func() {
req:=http.NewRequestWithContext(ctx,http.MethodGet,url,nil)
respose, err:=cli.Do(req)
if err != nil {
cancel()
return
}
}()
对于所有http请求,您应使用相同的ctx
,如果请求失败,则将其取消。取消上下文后,所有其他http请求也应取消。