发生错误时如何停止goroutine

时间:2019-11-15 02:44:27

标签: go goroutine

当一个发生错误时,如何停止另一个?

我必须使用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)
}

1 个答案:

答案 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请求也应取消。