首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当请求时,goroutine很快阻止了http服务器。

当请求时,goroutine很快阻止了http服务器。
EN

Stack Overflow用户
提问于 2017-09-08 16:15:35
回答 1查看 124关注 0票数 0

goroutine在重新配置时锁定了http服务器

下面的代码将很快被阻止

在设备管理功能中,通过访问http接口来确定设备是否在线,访问1000个设备,目前的程序大致如下所示,高露端面的数量不是很高,但很快程序就不会移动,cpu、内存占用也不会太高。

代码语言:javascript
复制
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 {

    }
}

区块

下面的代码不会阻塞,这就是为什么,希望给我一些建议,谢谢

代码语言:javascript
复制
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 {
        for {
        go b()
        time.Sleep(time.Millisecond * 10)
        fmt.Printf("go:%d\n", runtime.NumGoroutine())
    }
}

无块

EN

回答 1

Stack Overflow用户

发布于 2017-09-13 08:57:19

我认为没有转换点。

Go调度程序是不可抢占的。(合作社)

所有的进度都必须是协作的。

代码语言:javascript
复制
func main() {
    go c()
    for {
        // it is not cooperative
    }
}

Go调度程序只能在特定点切换。

具体要点是I/O,chan,Sleep,Gosched

在块示例中尝试下面的代码

代码语言:javascript
复制
func main() {
    go c()
    for {
        runtime.Gosched() // or time.Sleep(any)
    }
}

我希望这能帮到你

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46120712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档