go小试牛刀-select通道选择和超时处理

通道选择

//go小试牛刀-s通道选择
package main
import (
	"fmt"
	"time"
)

func main () {
	msgch1 := make(chan string)
	msgch2 := make(chan string)

	go func(){
		time.Sleep(time.Second * 1)
		msgch1 <- "1 goroutine"
		fmt.Println("first msg tx ed")
	}()

	go func() {
		time.Sleep(time.Second * 2)
		msgch2 <- "2ed gorotine"
		fmt.Println("Second msg transmitted")
	}()

	select {
	case msg1 := <- msgch1:
		fmt.Println("received msg ", msg1)
	case msg2 := <- msgch2:
		fmt.Println("received msg ", msg2)
		}
		//如果只执行一次 select,只输出最先的msgch,  <-接受一次阻塞

	select {
	case msg1 := <- msgch1:
		fmt.Println("received msg ", msg1)
	case msg2 := <- msgch2:
		fmt.Println("received msg ", msg2)
	}

	time.Sleep(time.Second * 1)// 用于routine协程2的并发完成
}
//go的通道选择类似于switch语句,优点是可以根据是否受到信息来阻塞当前进程
//等待并发程序的完成; 后续利用select进行优雅地超时处理也是类似的;

超时处理

/*
go routine + select chan实现优雅地超时处理

 */
package main
import (
	"fmt"
	"time"
)

func main() {
	// 1 time out case
	mch1 := make(chan string)
	go func () {
		time.Sleep(time.Second * 1)
		fmt.Println("Routine 1 >>>>>")
		mch1 <- "1 second"
	} ()

	select {
	case msg1 := <- mch1 :
		fmt.Println("msg received ", msg1)
	case t2 := <-time.After(time.Second * 1):
		fmt.Println("timeout after", t2)
	}

	// case2: rx msg before timeout condition
	mch2 := make(chan string)
	go func () {
		time.Sleep(time.Second * 1)
		fmt.Println("Routine 2 >>>>>")
		mch2 <- "I'm routine 2"
	} ()

    select {
    case msg2 := <- mch2:
    	fmt.Println("Succced rx msg: ", msg2)
    case <- time.After(time.Second * 2) :
    	fmt.Println("time out after 2s")
	}

}
// go超时处理要点: select使用2个通道,
//1)正常接受chan传参; 2) 计时分支: <- time.After(1s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值