码迷,mamicode.com
首页 > 其他好文 > 详细

channler多路选择和超时控制

时间:2019-07-08 16:30:56      阅读:105      评论:0      收藏:0      [点我收藏+]

标签: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

channler多路选择和超时控制

标签:cond   渠道   package   sel   sync   没有   出现   ISE   exit   

原文地址:https://www.cnblogs.com/quang3727/p/11151942.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!