标签:case 执行 3.10 fmt default channel Go 超时 select
3.10 Go之channel
超时机制
什么是超时?
所谓的超时可以理解为token
过期,需要重新操作
Go
中的channel
超时机制
为了防止channel
被其他goroutine
竞争,所以需要设置一个超时处理器
处理办法:
使用select
来处理超时
Go
中select
的使用方法以及和switch
的区别
select
的特点:
-
其中有一个
case
完成程序就会往下执行而不考虑其他case
的情况 -
每个
case
的语句里面必须是一个i/o
操作 -
select
块当中有多条语句可以执行(多个goroutine
都不阻塞)时随机选择一条来执行
select{
case <-chan1:
// chan1成功读取到数据则执行该case
case chan2 <- 1:
// 成功向chan2写入数据则执行该case
default:
// 如果上面都没有成功,则进入default处理流程
}
所有goroutine
都阻塞的情况:
-
没有定义
default
则select
语句会被阻塞.直到至少有一个通信可以进行下去 -
定义了
default
语句,执行default
.同时程序的执行会从select
语句后的语句中恢复
实例代码:
package main
import (
"fmt"
"time"
)
/*
模拟一个go的超时处理办法
使用select进行处理
*/
func main() {
// 定义两个通道,一个进,一个出
ch := make(chan int)
quit := make(chan bool)
// 开启一个协程进行超时处理
go func() {
// 循环执行select
for {
select {
/* 能从ch通道当中读取到数据 */
case num := <-ch:
fmt.Println("号码 = ", num)
case <-time.After(3 * time.Second):
fmt.Println("超时")
// 同时将该条信息告知出通道--->放入成功
quit <- true
//default:
// fmt.Println("未知情况!")
// quit <- false
}
}
}()
// 循环往ch通道放值
for i := 0; i < 5; i++ {
ch <- i
time.Sleep(time.Second)
}
// 匿名接收quit通道内的值--->只是为了保证goroutine不死锁
judge := <-quit
switch judge {
case true:
fmt.Println("程序结束!")
case false:
fmt.Println("程序异常!")
}
}
分析:
-
前四次执行的是
case num
的操作,最后一次执行的是case <-time.After
的逻辑 -
每次往
ch
通道中放入值的时候都进行了时间等待,为了超时的时候执行time.After
-
**
default
要重点理解,
标签:case,执行,3.10,fmt,default,channel,Go,超时,select 来源: https://www.cnblogs.com/JunkingBoy/p/16033289.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。