From fbca9d6acdb269a9664a57051d4503e10f4be4df Mon Sep 17 00:00:00 2001 From: xc Date: Tue, 14 Oct 2025 17:00:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8select=E8=B0=83=E6=95=B4rpc?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aufs/core/sysmonitor.go | 53 +++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/aufs/core/sysmonitor.go b/aufs/core/sysmonitor.go index 689e2fb..f69737e 100644 --- a/aufs/core/sysmonitor.go +++ b/aufs/core/sysmonitor.go @@ -6,6 +6,7 @@ import ( "log" "net/http" "net/rpc/jsonrpc" + "time" ) // 返回json数据 @@ -38,31 +39,43 @@ func SysMonitor(w http.ResponseWriter, r *http.Request) { // todo 待优化 for _, sc := range scslist { - + // 利用channel控制超时 + errch := make(chan error, 1) // 利用jsonrpc 请求结果 // 构建访问的链接 ser := sc.Addr + ":" + sc.Port - // 链接服务 - client, err := jsonrpc.Dial("tcp", ser) - if err != nil { - log.Fatalf("Dial SysMonitor failed: %v", err) - // 跳过 - continue - } + go func() { + // 链接服务 + client, err := jsonrpc.Dial("tcp", ser) + // 发生错误,执行下一个 + if err != nil { + log.Fatalf("Dial SysMonitor failed: %v\n", err) + errch <- err + } + // + defer client.Close() + // 返回的是pb字符串 + var resp string + // 调用远程方法 SysmonitorService.GetSysInfo + client.Call("SysmonitorService.GetSysInfo", nil, &resp) + // 构建json结构的字符串 + sinfo := SysInfo{ + Addr: sc.Addr, + Port: sc.Port, + Resp: resp, + } + // 添加到rsdata + rsdata.Slist = append(rsdata.Slist, sinfo) + }() + // - defer client.Close() - // 返回的是pb字符串 - var resp string - // 调用远程方法 SysmonitorService.GetSysInfo - client.Call("SysmonitorService.GetSysInfo", nil, &resp) - // 构建json结构的字符串 - sinfo := SysInfo{ - Addr: sc.Addr, - Port: sc.Port, - Resp: resp, + select { + case err := <-errch: + log.Printf("SysMonitor failed: %v\n", err) + case <-time.After(5 * time.Second): + log.Printf("SysMonitor timeout: %v\n", ser) } - // 添加到rsdata - rsdata.Slist = append(rsdata.Slist, sinfo) + } // 生成json数据 sysresp := SysResp{