ホームページ  >  記事  >  バックエンド開発  >  Go で選択を待つ必要があるのはなぜですか?

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

王林
王林転載
2024-02-11 08:24:091159ブラウズ

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 までご連絡ください。