您的位置 首页 技术

golang select不阻塞吗

select是go语言中常用的一个关键字,是用来监听和channel有关的IO操作,当 IO 操作发生时,触发相应的动作。 如果有多个case都可以运行,Select会随机公平地选…

select是go语言中常用的一个关键字,是用来监听和channel有关的IO操作,当 IO 操作发生时,触发相应的动作。

如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行。 (推荐学习:go)

否则:

如果有default子句,则执行该语句。

如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。

基本用法

//select基本用法select {case <- chan1:// 如果chan1成功读到数据,则进行该case处理语句case chan2 <- 1:// 如果成功向chan2写入数据,则进行该case处理语句default:// 如果上面都没有成功,则进入default处理流程

如果有一个或多个IO操作可以完成,则Go运行时系统会随机的选择一个执行,否则的话,如果有default分支,则执行default分支语句,如果连default都没有,则select语句会一直阻塞,直到至少有一个IO操作可以进行

start := time.Now()    c := make(chan interface{})    ch1 := make(chan int)        ch2 := make(chan int)    go func() {        time.Sleep(4*time.Second)        close(c)    }()    go func() {        time.Sleep(3*time.Second)        ch1 <- 3    }()      go func() {        time.Sleep(3*time.Second)        ch2 <- 5    }()    fmt.Println("Blocking on read...")    select {    case <- c:        fmt.Printf("Unblocked %v later.\n", time.Since(start))    case <- ch1:        fmt.Printf("ch1 case...")      case <- ch2:        fmt.Printf("ch1 case...")    default:        fmt.Printf("default go...")    }

运行上述代码,由于当前时间还未到3s。所以,目前程序会走default。

以上就是golang select不阻塞吗的详细内容,更多请关注24课堂在线网其它相关文章!

本文来自网络,不代表24小时课堂在线立场,转载请注明出处:https://www.24ketang.cn/16450.html

为您推荐

返回顶部