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