ホームページ  >  記事  >  バックエンド開発  >  golang selectはブロックしないのでしょうか?

golang selectはブロックしないのでしょうか?

(*-*)浩
(*-*)浩オリジナル
2019-12-17 11:01:435238ブラウズ

golang selectはブロックしないのでしょうか?

select は Go 言語で一般的に使用されるキーワードです。チャネルに関連する IO 操作を監視するために使用されます。IO 操作が発生すると、対応するアクションがトリガーされます。

実行できるケースが複数ある場合、Select は実行するケースをランダムかつ公平に選択します。その他は実行されません。 (推奨学習: go)

それ以外の場合:

default 句がある場合、ステートメントが実行されます。

default 句がないと、select は通信が実行できるようになるまでブロックされ、Go はチャネルまたは値を再評価しません。

基本的な使用法

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

1 つ以上の IO 操作を完了できる場合、Go ランタイム システムは実行する 1 つをランダムに選択します。そうでない場合は、デフォルトのブランチの場合、デフォルトのブランチ ステートメントが実行されます。デフォルトがない場合、select ステートメントは、少なくとも 1 つの 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...")
    }

上記のコードを実行します。時間はまだ3秒未満です。したがって、現在のプログラムがデフォルトで実行されます。

以上がgolang selectはブロックしないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。