由于业务需要,服务器通过后台可自定义时间段轮询通过 websocket 向前端发送数据,但是运行一段时间后报错:
| goroutine 2 [chan send, 20 minutes]: |
| serve_api/internal/app/v1/service.workers.func1(0xc0001b4480, 0xc000026980, 0x12) Users/jssmac/Documents/project/golang/serve_api/internal/app/v1/service/isv.go:60 +0x63|
//读取可查询数据列表
func GetIsvList() (interface{}, error) {
var (
newList []interface{}
list []models.LsvInfo
)
models.Find(&list, map[string]interface{}{"status": 1})
if len(list) > 0 {
//等待组完成
var wg sync.WaitGroup
//声明等待数
wg.Add(len(list))
for _, item := range list {
go func(name string) {
var c1 = worker(name)
n := <-c1
newList = append(newList, n)
wg.Done()
}(item.Item)
}
wg.Wait()
return newList, nil
} else {
return models.Array, nil
}
}
// chan
func worker(name string) chan interface{} {
out := make(chan interface{})
go func(i string) {
for {
data := getIsvInfo(i)
out <- data //原文件 isv.go:60 指向本行
}
}(name)
return out
}
//获取 ISV 数据
func getIsvInfo(name string) *Result {
urls := "http://192.168.1.188:8000/isv/"
params := url.Values{
"name": []string{name},
}
res, _ := request("GET", urls, []byte(params.Encode()))
regeo := new(Result)
json.Unmarshal(res, ®eo)
return regeo
}
//request 请求包装
func request(method, url string, data []byte) (body []byte, err error) {
if method == "GET" {
url = fmt.Sprint(url, "?", string(data))
data = nil
}
client := http.Client{Timeout: 10 * time.Second}
req, err := http.NewRequest(method, url, bytes.NewBuffer(data))
if err != nil {
return body, err
}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
body, err = ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
return body, err
}
return body, err
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.