Go Channel のバッファ制限が書き込み/読み取りを正しく制限しないのはなぜですか?

WBOY
リリース: 2024-02-09 10:30:19
転載
458 人が閲覧しました

为什么Go Channel的缓冲区不能正确限制写入/读取?

php エディターの Youzi が、この記事でよくある質問に答えます。「なぜ Go チャネルのバッファーは書き込み/読み取りを正しく制限しないのですか?」Go 言語では、チャネルというメカニズムがあります。コルーチン間の通信用。バッファーを備えたチャネルを使用する場合、書き込みまたは読み取り操作の数を制限することでプログラムの動作を制御できることが期待されます。ただし、実際には、チャネル バッファーは書き込み/読み取り操作の数を直接制限することはできません。この問題の原因と解決策については、以下で詳しく説明します。

質問内容

チャネルを使用して 2 つの go ルーチン間で通信しようとしています。まず、整数チャネルを作成し、それを 0 から 10 までの一連の数値を出力する go ルーチンにパラメータとして渡しました。これらのプログラムの出力には意味がありません。

これはメインコードです:

リーリー

このコードを実行すると、次の出力が得られました:

リーリー

2 回の書き込み実行の後に 2 回の読み取り実行が続くことに注意してください。

その後、次の機能を実現するためにバッファ サイズを設定します。

リーリー

その後、次の出力が得られます:

リーリー

現在、5 回の書き込み実行と 5 回の読み取り実行があることに注意してください。

コードと出力を取得したら、最後の疑問が生じます。なぜこれらの実行はそのように動作するのでしょうか?まず、一度に読み書きできるのは 1 つの数字だけではないでしょうか。それ以上に、なぜ 2 回目の実行では毎回 3 つではなく 5 つの数値を読み書きするのでしょうか (これはバッファ サイズのため)。

回避策

メッセージが出力されるとき、およびチャネルから数値が読み取られるとき、またはチャネルに数値が書き込まれるとき、混乱します。

書き込みが発生した場合、「書き込み」メッセージは表示されません。これらは書き込み間のある時点で発生します。同様に、「読み取り中」メッセージは読み取り間のある時点で発生します。

最初のコード スニペットを配置する 1 つの方法を次に示します。これにより、次の出力が生成されます。

  • 主に読み取りを試みてからブロックします。
  • スタッフは「Writing 0」と印刷します。
  • ワーカーは 0 を書き込み、メインは読み取ります。
  • 作業者は「Writing 1」を印刷します。
  • ワーカー スレッドは 1 を書き込もうとしましたが、ブロックされました。
  • 主に「Reading 0」を出力します。
  • 主な内容は1です。
  • メインプリント「Reading 1」。
  • 主に読み取りを試みてからブロックします。

制御はこのようにメインとワーカーの間で継続的に渡され、ブロックする前にそれぞれが 2 つのメッセージを出力します。

同様に、2 番目のフラグメントは次のように配置できます:

  • 主に読み取りを試みてからブロックします。
  • Worker は「Writing 0」を出力し、0 を main に直接送信します。
  • ワーカーは「Writing 1」を出力し、1 をバッファします。
  • Worker は「Writing 2」を出力し、2 をバッファします。
  • Worker は「Writing 3」を出力し、3 をバッファします。
  • ワーカー スレッドは「Writing 4」を出力し、4 を送信しようとする試みをブロックします。
  • main はブロックされた読み取りを完了し、「Reading 0」を出力します。
  • main はバッファされた 1 を読み取り、「Reading 1」を出力します。
  • main はバッファされた 2 を読み取り、「Reading 2」を出力します。
  • main はバッファされた 3 を読み取り、「Reading 3」を出力します。
  • main は、ワーカーがブロックされた 4 を読み取り、「読み取り中 4」を出力します。
  • 主に読み取りを試みてからブロックします。
  • 実行はワーカーに戻ります...

以上がGo Channel のバッファ制限が書き込み/読み取りを正しく制限しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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