最近在学习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
嗯~我的疑惑就是代码里所有的协程都是运行在一个线程里的,系统切换应该与这几个协程没有关系。当这个协程再次切换回来时,是应该延续上次运行着的协程继续处理,还是通过调度器重新选择一个?
#5
更多评论
在哪里看到,gomaxprocs = 1 时,会被一个 goroutine 占用不放,如果这样,Go 的设计也太烂了。注意并发和并行的区别。一个 CPU 也可以并发的哦。
#1