goroutine请求http服务器时很快就阻塞,请问什么原因,或者如何定位问题?

www2t · · 1462 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

###goroutine请求http服务器时很快就阻塞,请问什么原因,或者如何定位问题? 在做一个设备管理的功能,通过访问http服务器的REST ful接口确定设备是否在线,30s访问1000个设备,目前写的方案大致如下 其中看到goroutine的数量并不是很高,但很快程序就不动了,cpu,内存也并没有占用过高 ```golang package main import ( "fmt" "net/http" "runtime" "time" ) func a() { b() //..... } var bb = 0 func b() { fmt.Printf("b:%d\n", bb) bb++ resp, err := http.Get("http://www.baidu.com") if err == nil { resp.Body.Close() } //... } func c() { t := time.NewTicker(time.Second * 30) for { fmt.Printf("start time:%s\n", time.Now().Format("15:04:05")) bb = 0 for i := 0; i < 1000; i++ { go a() if i%11 == 0 { time.Sleep(time.Millisecond * 300) fmt.Printf("i:%d go:%d\n", i, runtime.NumGoroutine()) } } <-t.C fmt.Printf("over time:%s\n", time.Now().Format("15:04:05")) } } func main() { go c() for { } } ``` 程序卡死了 ![QQ截图20170908232936.png](https://static.studygolang.com/170908/7a2cd821dd425080b088a4af86bc3907.png) ** 但是如下的程序却可以很正常的运行** ``` golang package main import ( "fmt" "net/http" "runtime" "time" ) func a() { b() } var bb = 0 func b() { fmt.Printf("b:%d\n", bb) bb++ resp, err := http.Get("http://www.baidu.com") if err == nil { resp.Body.Close() } } func main() { for { go b() time.Sleep(time.Millisecond * 10) fmt.Printf("go:%d\n", runtime.NumGoroutine()) } } ``` 即使很多的Goroutine 也没有问题,还往高手指点一二 ![QQ截图20170908234323.png](https://static.studygolang.com/170908/afb0ba396cd7716e63db18567158dab4.png)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1462 次点击  
加入收藏 微博
6 回复  |  直到 2017-09-15 08:55:07
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传