この記事では、編集者の Youzi が、チャネルに複数回書き込むことでチャネルをブロックする Golang の動作を理解する方法を紹介します。 golang では、チャネルはコルーチン間でデータを受け渡すための重要なメカニズムです。チャネルがいっぱいになると、チャネルが空くまで書き込み操作はブロックされます。この動作を簡単な例で示し、ブロック チャネルの仕組みとその使用方法を説明します。初心者でも経験豊富な golang 開発者でも、この記事から役立つ知識と実践的な経験を得ることができます。はじめましょう!
私は golang を初めて使用し、言語の同時実行性を理解しようとしています。いくつかの値をチャネルにプッシュして読み取るコードがあります。
リーリー上記のプログラムの出力は次のとおりです。 リーリー
4. (チャネルへの別の書き込み) が
5. (チャネルからの最初の読み取り) より前に実行される理由が理解できません。ブロックされ、チャネルから値が読み取られるまで (ステップ
5.) チャネルは使用できなくなります。ブロック動作を誤解していませんか。ステップ
3. には、
main goroutine ブロックと
Greet (ステップ
4.) しかありません。追加の値をチャネルに書き込むことはできますか?説明があれば本当に混乱が解消されます:)
###乾杯、
DD
c と
go do2(c) ステートメントを交換することで修正できます。
回避策
Go では、チャネル (ステップ 3 の
c <- "main::Hello"
Greet2 コルーチンの両方がチャネルからの値を待機しているため、ステップ 3 で値を送信すると、そのうちの 1 つが送信されます (どちらであるかは保証されません)。 ) ブロックが解除され、実行が続行されます。
一連の出来事を段階的に説明しましょう:
メイン プログラムが開始され、チャネル
が作成されます。
と
Greet2値 "main::Hello" をチャネルに送信すると、他の goroutine がチャネルからデータを読み取るまで、メインの goroutine がブロックされます。ただし、2 つのゴルーチンのうちの 1 つ (
Greet または
Greet2
挨拶 ブロックを解除して実行を続行します。 「4. 'Greet::John' をチャネルに追加...」というメッセージをログに記録し、チャネルに「Greet::John!」を送信します。現時点では他の goroutine がチャネルから読み取ることができないため、これにより
Greet
Greet2 ブロックを解除して実行を続行します。 「5. Read Greet2::main::Hello」というメッセージをログに記録し、チャネルから値「main::Hello」を読み取ります。
Main はチャネル上で別の値「main::Bye」を送信します。この時点では、
Greet
Greet はまだ書き込み時にブロックされているため、「8. Read Greet::main::Bye !」というログは記録されません
したがって、ここでの動作を理解するための鍵は、チャネルに値を送信すると、チャネルからのデータの読み取りを待機しているゴルーチンのロックが解除されるということです。待機中のゴルーチンのブロックが解除される順序は未定義であり、スケジューラによって異なります。あなたの場合、たまたま
要約すると、観察した動作は Go チャネルの動作と完全に一致していますが、競合する Goroutine 間の実行順序は保証されていないことに注意してください。
以上がチャネルに複数回書き込むことで Golang がチャネルをブロックする動作を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。