为了看golang多个goroutine上怎么调度,上代码:
`package main`
`import(`
`"fmt"`
`)`
`func main(){`
`go func(){//goroutine 持续打印1`
`i:=1`
`fmt.Println(i)`
`}()`
`for{//main 程持续打印0`
`i:=0`
`fmt.Println(i)`
`}`
`}`
实际上在打印一段1之后会一直打印0,也就是没有切回main之外的goroutine。
`package main`
`import(`
`"fmt"`
` "time"`
`)`
`func main(){`
`go func(){//goroutine 持续打印1`
`i:=1`
`fmt.Println(i)`
`}()`
`for{//main 程持续打印0`
` time.Sleep(time.Second*1)//每次阻塞一秒再打印`
`i:=0`
`fmt.Println(i)`
`}`
`}`
这里就可以发现别的goroutine在执行了。
实际工作中main程序会一直执行别的程序体,不会特意进行阻塞。这时候就要祭出golang的runtime了。
`package main`
`import(`
`"fmt"`
` "runtime"`
`)`
`func main(){`
` runtime.GOMAXPROCS(2)//运行机器是双核`
`go func(){//goroutine 持续打印1`
`i:=1`
`fmt.Println(i)`
`}()`
`for{//main 程持续打印0`
`i:=0`
`fmt.Println(i)`
`}`
`}`
这里的运行结果就可以看到预计的各个goroutine不停切换的效果了。
上结论:单核上运行多线程时,一直在运行的是main线程,其余线程在首次执行之后只有等待main主动让出时间才能执行。
阅读(1313) | 评论(0) | 转发(0) |