golang中的select详解
生活随笔
收集整理的這篇文章主要介紹了
golang中的select详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
注意
- 監聽的case中,沒有滿足條件的就阻塞
- 多個滿足條件的就任選一個執行
- select本身不帶循環,需要外層的for
- default通常不用,會產生忙輪詢
- break只能跳出select中的一個case
加入了默認分支,那么無論涉及通道操作的表達式是否有阻塞,select語句都不會被阻塞。如果那幾個表達式都阻塞了,或者說都沒有滿足求值的條件,那么默認分支就會被選中并執行。
如果沒有加入默認分支,那么一旦所有的case表達式都沒有滿足求值條件,那么select語句就會被阻塞。直到至少有一個case表達式滿足條件為止。
如果select語句發現同時有多個候選分支滿足選擇條件,那么它就會用一種偽隨機的算法在這些分支中選擇一個并執行。注意,即使select語句是在被喚醒時發現的這種情況,也會這樣做
作用
go里面提供了一個關鍵字select,通過select可以監聽channel上的數據流動
select的用法與switch語言非常類似,由select開始一個新的選擇塊,每個選擇塊條件由case語句來描述
與switch語句可以選擇任何可使用相等比較的條件相比,select有比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作
for {select {case <-chan1://.....case chan2<-1://....default://都沒成功,進入......} }在一個select語句中,go語言會按順序從頭到尾評估每一個發送和接收的語句
如果其中的任意一語句可以繼續執行(即沒有被阻塞),那么就從哪些可以執行的語句中任意選擇一條來使用
如果沒有任意一條語句可以執行(即所有的通道都被阻塞),那么有兩種可能的情況:
- 如果給出了default語句,那么就會執行default語句,同時程序的執行會從select語句后的語句中恢復
- 如果沒有default語句,那么select語句將被阻塞,直到至少有一個通信可以進行下去
防止channel超時機制
有時候會出現協程阻塞的情況,那么我們如何避免這個情況?我們可以使用select來設置超時
func main() {c := make(chan int)o := make(chan bool)go func() {for {select {case v:= <-c:fmt.Println(v)//5秒鐘自動關閉,避免長時間超時case <-time.After(5 * time.Second):fmt.Println("timeout")o<-truebreak}}}()//有值就主協程走,主協程走完就都沒了<-ofmt.Println("程序結束") }總結
以上是生活随笔為你收集整理的golang中的select详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang中的runtime
- 下一篇: golang中的死锁