为了看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)
}
}
```
实际上会一直打印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(){`
`go func(){//goroutine 持续打印1`
`i:=1`
`fmt.Println(i)`
`}()`
` runtime.GOMAXPROCS(2)//运行机器是双核`
`for{//main 程持续打印0`
`i:=0`
`fmt.Println(i)`
`}`
`}`
```
这里的运行结果就可以看到预计的各个goroutine不停切换的效果了。
搞笑,goroutine里没有循环啊,所以就只打印一次1,goroutine就天然结束了,而打印0是在for这个死循环里的,当然不停打印0
你看不到打印1是因为打印速度太快,1刚打印出来就被刷掉了(或者说是顶掉了)
你把这段
```
go func(){//goroutine 持续打印1
i:=1
fmt.Println(i)
}()
```
改为
```
go func(){//goroutine 持续打印1
for{
i:=1
fmt.Println(i)
}
}()
```
再试试
#5
更多评论
楼主还没搞懂go的goroutine怎么使用。。。这个根本就不是坑。。。你所有的案例里面,根本就没机会调用goroutine创建,都在主循环的for里循环执行,和go无关。。
#2