Go で選択を待つ必要があるのはなぜですか?

王林
リリース: 2024-02-11 08:24:09
転載
1188 人が閲覧しました

Go で選択を待つ必要があるのはなぜですか?

php エディタ Zimo の紹介: Go 言語では、select ステートメントは非常に重要な制御フロー ステートメントであり、同時実行性を達成するために複数のチャネルの操作を同時に監視するために使用されます。コントロール。 。なぜ選択を待つ必要があるのですか?これは、同時プログラミングでは通常、複数のチャネルからのデータまたはイベントを同時に処理する必要があり、select ステートメントは複数のチャネルを監視するのに役立ちます。いずれかのチャネルが操作可能になると、対応する操作が実行されます。それにより並行性を実現します。 select を使用すると、ブロックを効果的に回避し、プログラムの応答性と同時実行性を向上させることができます。

質問内容

コンテキストキャンセルについて知りました。 これが私のコードです。

リーリー ###聞きたい###

なぜこのようなことが起こるのでしょうか。 どのような知識が必要ですか?

出力を期待しています。

しかし、実際に得られる出力には「終了」は含まれません。

リーリー

修正コード

キャンセル機能にtime.Sleepを追加しました。 その後、出力は私が期待したものになります。

package main

import (
  "fmt"
  "context"
)

func main() {
  ctx := context.Background()

  do(ctx)
}

func do(ctx context.Context) {
  ctx, ctxCancel := context.WithCancel(ctx)

  resultCh := make(chan string)

  go terminate(ctx, resultCh)

  resultCh <- "value1"
  resultCh <- "value2"

  fmt.Println("pre cancel")

  ctxCancel()

  fmt.Println("post cancel")
}

func terminate(ctx context.Context, ch <-chan string) {
  for {
    select {
    case <-ctx.Done():
      fmt.Println("terminate")
      return
    case result := <-ch:
      fmt.Println(result)
    }
  }
}
ログイン後にコピー

Solution

私が理解しているように、select の使用の背後にある中心的な考え方は、少なくとも 1 つの条件が「準備完了」になるまで待つことです。以下に役立つ例を示しました。ここでの select は、チャネル ch からの値の受信、または 1 秒のタイムアウトの発生を待つために使用されます。

リーリー

以上がGo で選択を待つ必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!