package main
import (
"fmt"
"time"
)
func main() {
go sheep(1)
go sheep(2)
time.Sleep(time.Millisecond)
}
func sheep(i int) {
for ; ; i += 2 {
fmt.Println(i, "只羊")
}
}
上面是关于去程的一个简单程序,结果应该是输出顺序的整数,但我只能输出奇数,这是什么原因啊?
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
go sheep(1)
go sheep(2)
time.Sleep(time.Millisecond)
}
func sheep(i int) {
for ; ; i += 2 {
fmt.Println(i, "只羊")
}
}
这样?还是不行,`runtime.GOMAXPROCS(runtime.NumCPU())`这句是什么意思啊?是不是根据cpu数量决定类似线程的数量?
确实是看了云动力这本书,就买了这本go的书,看着还行,尽量在专有名词上跟大家接轨。呵呵!
#2
更多评论
你在main函数开始处加上:`runtime.GOMAXPROCS(runtime.NumCPU())`
目前goroutine的调度实现的比较简单,堵塞时才会执行调度。
另外,你是看到《云动力》那本书上说:去程吧。还是直接叫goroutine吧,去程听着好别扭。呵呵
#1
至少我这边是可以。但你要知道,并发程序的结果是不可以预测的,你可以试试将Sleep的时间放长,应该会看到效果。
`runtime.GOMAXPROCS(runtime.NumCPU())` 是利用当前机器的CPU核数,允许有多少个goroutine并行。你可以打印 `runtime.NumCPU()` 的结果看看,看你的机器是几核的。
#3