###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)
有疑问加站长微信联系(非本文作者)