标签:case 示例 goroutine Golang chs channel 超时 select
1、select说明
select 是 Go 中的一个控制结构,每个 case 必须是一个通信操作,要么是发送要么是接收。 select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句(default:子句)应该总是可运行的。
2、超时处理
golang的select与channel配合使用进行超时处理。channel必须是有缓冲channel。
select用于等待一个或者多个channel的输出。
应用场景:主goroutine等待子goroutine完成,但是子goroutine无限运行,导致主goroutine会一直等待下去。而主线程想假如超过了一定的时没有返回的话,进行超时判断然后继续运行下去。
3、示例
package main
import (
"time"
"fmt"
)
var chs chan int = make(chan int, 1) //创建通道chs
func write(){
time.Sleep(3 * time.Second)
chs <- 1 //chs中写入1
}
func read() {
select {
case ch1 := <-chs: //将chs中的data写到ch1
fmt.Println(ch1)
return
case <-time.After(4*time.Second): //超时判断
fmt.Println("read time out")
return
}
}
func main() {
go write() //启动新的协程,在其中执行了3秒的sleep,并执行其他操作,可以多起几个协程,试试效果
read() //主协程会根据select语句进行判断执行
}
//以上代码结果:
[root@localhost]# go run main.go
1
//如果将time.After中改为1*time.Second,则输出为:
[root@localhost]# go run main.go
read time out
原因在于,select会由上到下判断哪个case可以执行。
标签:case,示例,goroutine,Golang,chs,channel,超时,select 来源: https://blog.csdn.net/oceanstudy123/article/details/120334454
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。