标签:cond 渠道 package sel sync 没有 出现 ISE exit
一.多渠道的选择和超时控制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
标签:cond 渠道 package sel sync 没有 出现 ISE exit
原文地址:https://www.cnblogs.com/quang3727/p/11151942.html