go select顺序读

425 阅读1分钟

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)
}