关于go协程使用chan的疑惑

xiaogan18 · · 1141 次点击
```go package main import ( "fmt" "sync" ) const ( nums = "123456789" letters = "abcdefghi" ) func main() { ch1 := make(chan int) ch2 := make(chan int) wd := sync.WaitGroup{} wd.Add(len(nums) + len(letters)) fun1 := func() { for _, v := range nums { <-ch2 fmt.Print(string(v)) wd.Done() ch1 <- 1 } } fun2 := func() { for _, v := range letters { <-ch1 fmt.Print(string(v)) wd.Done() ch2 <- 1 } } go fun1() go fun2() ch2 <- 1 wd.Wait() } ```
#2
更多评论
每个goroutine的执行顺序是不确定的,并不是谁先启动就谁先执行,我在https://play.golang.org/上运行的结果还是这样的呢:1ab23cd45ef67gh89i
#1
goroutine是随机的,所以在多核的环境里你每次得到的顺序都可能不一样,如果你想固定下来,加一句话```runtime.GOMAXPROCS(1)``` ok,每次都一样了,因为协程再并发CPU执行都是顺序的,你限制只使用单核,那就是老老实实的顺序执行了,嘿嘿。
#3