最近在学习GO语言,想深究一下其中的协程机制,看了一些资料,大概的了解是在启动GO程序时,根据gomaxprocs的值创建n个执行线程,代码中生产的协程会放入到一个待执行队列中,每个线程从队列中获取协程并执行其中的代码。由于基于上面的认知,写了如下几段代码来验证下我的猜想:
```go
func loopPrint(info string) {
for {
fmt.Println(info)
}
}
func testforgoroutine() {
fmt.Println(runtime.GOMAXPROCS(1)) //启动一个线程
go loopPrint("22222")
go loopPrint("33333")
go loopPrint("44444")
go loopPrint("55555")
for {
fmt.Println("11111")
}
}
func main() {
testforgoroutine() //此时应该只会打印11111
}
```
但实际的运行情况却是1-5的数据都有打印:
```
11111
11111
11111
33333
55555
55555
```
我的理解是主协程中并没有引发阻塞等出让CPU情况,根据协程的特性应该是一直占用着才对。但实际情况看感觉go ***出的更像是一个线程而非协程,哪位大牛能解答一下这个疑惑呀,不慎感激(或者大家一起讨论一下)
btw,我的环境是go version go1.7rc6 windows/386
在哪里看到,gomaxprocs = 1 时,会被一个 goroutine 占用不放,如果这样,Go 的设计也太烂了。注意并发和并行的区别。一个 CPU 也可以并发的哦。
#1
更多评论