channler多路选择和超时控制


一.多渠道的选择和超时控制select{}
1.多需渠道选择:
当任何一个case不处于阻塞情况会输出case内的逻辑,
当所有的都没有准备好都处于阻塞情况的话select出现defalt就会执行defalut内代码。
select {
case ret := <-retCh1:
fmt.Println(ret)
case ret := <--retCh2:
fmt.Println(ret)
default:
t.Errorf("No one returned")
}
2.超时控制:我们不希望channler执行超过限制时间时可以使用超时控制,一旦channler执行时间超过超时控 制设置的时间可以做些异常或者其他逻辑处理
select {
case ret := <-retCh1:
fmt.Println(ret)
case <-time.After(time.Second* 1):
t.Errorf("time out")
}

----------------------------------------------------------------------------------------------
package select_test

import (
"fmt"
"testing"
"time"
)

func otherTask() {
fmt.Println("working on something else")
time.Sleep(time.Millisecond * 100) //等待100毫秒
fmt.Println("Task is done.")
}
func TestService(t *testing.T) {
//fmt.Println(service())
//otherTask()
fmt.Println("12")
}
func service() string {
time.Sleep(time.Millisecond * 500) //等待500毫秒
return "Done"
}

//使用channler处理
func AsyncService() chan string {
retch := make(chan string)
go func() {
ret := service()
fmt.Println("returned result.")
retch <- ret //把结果放在channler里
fmt.Println("service exited")
}()
return retch
}

func TestAsyncService(t *testing.T) {
select {
case ret := <-AsyncService():
fmt.Println(ret)
case <-time.After(time.Millisecond * 10):
t.Errorf("time out")
}
}
//(当chan执行时间超过超时设置的时间)输出超时 :
--- FAIL: TestAsyncService (0.01s)
select_test.go:41: time out
FAIL

posted @ 2019-07-08 16:18  易云客  阅读(291)  评论(0编辑  收藏  举报