Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 使用goroutines WaitingGroup时随机发生的错误_Asynchronous_Go - Fatal编程技术网

Asynchronous 使用goroutines WaitingGroup时随机发生的错误

Asynchronous 使用goroutines WaitingGroup时随机发生的错误,asynchronous,go,Asynchronous,Go,我有一个包含两个goroutine的处理程序。前端每10秒执行一次处理程序。一旦调用,goroutines将向外部API发送GET-http请求。出于某种原因,有时(不经常)我会在任何goroutine中随机得到以下错误(似乎外部API拒绝了请求) 状态代码:408 死机:读取tcp 192.168.1.106:62598->80.243.175.58:443:wsarecv:现有连接被远程主机强制关闭。戈罗廷 8280[正在运行]: 监控/监控-v2-goAPI/services.GetNod

我有一个包含两个goroutine的处理程序。前端每10秒执行一次处理程序。一旦调用,goroutines将向外部API发送GET-http请求。出于某种原因,有时(不经常)我会在任何goroutine中随机得到以下错误(似乎外部API拒绝了请求)

状态代码:408

死机:读取tcp 192.168.1.106:62598->80.243.175.58:443:wsarecv:现有连接被远程主机强制关闭。戈罗廷 8280[正在运行]: 监控/监控-v2-goAPI/services.GetNodeCpuLimits.func2(0x815ba0, 0xc04231a1c0,0x0,0x0,0x0,0xc042158240,0x14,0x0,0x0,…)

发生这种情况时,会触发死机(err),我的应用程序终止。自从我以异步方式重建处理程序以提高速度(在请求只是同步之前)以来,就发生了这个错误

我想知道我是否做错了什么。如果没有,我该如何处理?我付不起终止申请的费用

代码

   func TestFunc(w http.ResponseWriter, r *http.Request) {

        c := make(chan NgxJSON)
        wg := &sync.WaitGroup{}

        var queryParams QueryParams
        _ = json.NewDecoder(r.Body).Decode(&queryParams)
        fmt.Println("- queryParams ->", queryParams)

        wg.Add(1)
        go func(queryParams QueryParams, c chan NgxJSON, wg *sync.WaitGroup) {
            defer wg.Done()

            req, err := http.NewRequest("GET", APIURL1+queryParams.Param1, nil)


            if err != nil {
                fmt.Println(err)
                return
            }

            client := &http.Client{}
            resp, err := client.Do(req)
            if err != nil {
                panic(err)   //<-- Error triggers here!!
            }
            defer resp.Body.Close()


            body, _ := ioutil.ReadAll(resp.Body) 

            var response Response
            json.Unmarshal([]byte(string(body)), &response)


            //DO THINGS

            c <- ngxJSON

        }(queryParams, c, wg)

        wg.Add(1)
        go func(queryParams QueryParams, c chan NgxJSON, wg *sync.WaitGroup) {
            defer wg.Done()
            req, err := http.NewRequest("GET", APIURL2+APIURL2+queryParams.Param2, nil)

            if err != nil {
                fmt.Println(err) 
                return
            }

            client := &http.Client{}
            resp, err := client.Do(req)
            if err != nil {
                panic(err) //<-- Error triggers here!!
            }
            defer resp.Body.Close()



            body, _ := ioutil.ReadAll(resp.Body)

            var response Response
            json.Unmarshal([]byte(string(body)), &response)


           //DO THINGS

                c <- ngxJSON

            }

        }(queryParams, c, wg)

        go func() {
            wg.Wait()
            close(c)
        }()

    //DO THINGS



    }
func TestFunc(w http.ResponseWriter,r*http.Request){
c:=make(chan NgxJSON)
wg:=&sync.WaitGroup{}
变量queryParams queryParams
_=json.NewDecoder(r.Body).Decode(&queryParams)
fmt.Println(“-queryParams->”,queryParams)
工作组.添加(1)
go func(queryParams queryParams,c chan NgxJSON,wg*sync.WaitGroup){
推迟工作组完成()
req,err:=http.NewRequest(“GET”,apirl1+queryParams.Param1,nil)
如果错误!=零{
fmt.Println(错误)
返回
}
客户端:=&http.client{}
resp,err:=client.Do(请求)
如果错误!=零{
恐慌(错误)//
我付不起终止申请的费用


然后不要惊慌,但要处理408,例如,通过重试或返回上游错误。

an基本上是关闭空闲连接的远程主机。我不认为您的代码有任何问题。您有一个正常的错误情况,并决定惊慌。您惊慌了。还有什么可以期待的呢?服务器完全可以重新启动408ond使用408。如果同时访问,服务器可能会更频繁地使用408进行响应?您的代码的错误在于其他东西,例如每个请求的新客户端和未处理的错误。是的,我预期会出现恐慌():P。只是想知道我可以用哪种方式处理它。感谢反馈,我会处理错误的事情。