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

###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())

}

}

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)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值