首頁 >後端開發 >Golang >golang select不阻塞嗎

golang select不阻塞嗎

(*-*)浩
(*-*)浩原創
2019-12-17 11:01:435285瀏覽

golang 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不阻塞嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn