golang中select,多个case同时满足时,select随机选择case执行,不能保证顺序,比如:
package main
import (
"fmt"
"time"
)
func producer1(ch chan int) {
time.Sleep(time.Duration(1)*time.Second)
ch <- 1
}
func producer2(ch chan int) {
time.Sleep(time.Duration(1)*time.Second)
ch <- 2
}
func main() {
ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
go producer1(ch1)
go producer2(ch2)
var i1,i2 int
for i:=0; i<2; i++ {
select {
case i1 = <-ch1:
fmt.Printf("RECEIVE %d\n", i1)
case i2 = <-ch2:
fmt.Printf("rECEIVE %d\n", i2)
}
}
close(ch1)
close(ch2)
}
可能有以下两种执行结果:
C:\Users\wangfeng\go\src\awesomeProject>go run select.go
RECEIVE 1
rECEIVE 2
C:\Users\wangfeng\go\src\awesomeProject>go run select.go
rECEIVE 2
RECEIVE 1
怎么保证一定先读ch2,再读ch1呢?
func main() {
ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
go producer1(ch1)
go producer2(ch2)
var i1,i2 int
select {
case i2 = <-ch2:
fmt.Printf("rECEIVE %d\n", i2)
select {
case i1 = <-ch1:
fmt.Printf("RECEIVE %d\n", i1)
}
}
close(ch1)
close(ch2)
}