goroutine在重新配置时锁定了http服务器
下面的代码将很快被阻止
在设备管理功能中,通过访问http接口来确定设备是否在线,访问1000个设备,目前的程序大致如下所示,高露端面的数量不是很高,但很快程序就不会移动,cpu、内存占用也不会太高。
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 {
}
}下面的代码不会阻塞,这就是为什么,希望给我一些建议,谢谢
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())
}
}发布于 2017-09-13 08:57:19
我认为没有转换点。
Go调度程序是不可抢占的。(合作社)
所有的进度都必须是协作的。
func main() {
go c()
for {
// it is not cooperative
}
}Go调度程序只能在特定点切换。
具体要点是I/O,chan,Sleep,Gosched
在块示例中尝试下面的代码
func main() {
go c()
for {
runtime.Gosched() // or time.Sleep(any)
}
}我希望这能帮到你
https://stackoverflow.com/questions/46120712
复制相似问题