并发编程select

如果多管道,一般使用for循环读取。

package main

import "fmt"

func main() {
	ch1:=make(chan int)
	go func(){
		sum:=0
		for i := 1; i < 1000; i++ {
			sum+=i
			ch1<-sum
		}
		close(ch1)		//关闭管道
	}()

	ch2:=make(chan int)
	go func(){
		for i := 1; i < 1000; i++ {
			ch2<-i+2
		}
		close(ch2)		//关闭管道
	}()


	// for {				//死循环方式读取管道值
	// 	value,ok:=<-ch1
	// 	if ok{
	// 		fmt.Println(" for ch1=",value)
	// 	}else{
	// 		break
	// 	}
	// }

	// for c:=range ch1{		//较为推荐的for-range读取,直到管道关闭就不再接收。
	// 	fmt.Println("range cha1=",c)
	// }

//如果定义多个管道,那么以上两种就有点吃力了,引入select方法
for   {
	select {			//必须为IO操作,要么读要么写。当多个分支条件满足时,会随机选择一个分支执行,本题需要持续接收值,所以需要加for
	case value,ok:=<-ch1:
		if ok {
			fmt.Println("select ch1=",value)
		}
	case value,ok:=<-ch2:
		if ok {
			fmt.Println("select ch2=",value)
		}
	}
 }

	fmt.Println("main 结束")  //为啥不执行这个?
}
posted @ 2021-11-13 21:21  柠檬橘  阅读(49)  评论(0编辑  收藏  举报