チャネルを使用する場合、ゴルーチンの実行順序はどうなりますか?
php エディタ Baicao は、よくある質問に答えます: 「チャネルを使用する場合、ゴルーチンの実行順序は何ですか?」 Go 言語では、ゴルーチンは軽量です スレッドは同時に実行できます。コルーチン間の通信にチャネルを使用する場合、チャネルの受信操作と送信操作はブロックされます。つまり、他のコルーチンの操作が完了するのを待ちます。したがって、複数のゴルーチンが同時にチャネルを操作する場合、それらの実行順序は不確実であり、各コルーチンのスケジューリングに依存します。つまり、どのゴルーチンが最初に実行され、どのゴルーチンが後に実行されるかを決定することは不可能であり、これは Go 言語のスケジューラによって決定されます。
質問内容
チャネル使用時のゴルーチンの実行順序はどうなりますか?チャネルの書き込みまたは読み取りにより、現在のゴルーチンが停止すると思います。しかし、私のテストコードは次のルールに従っていません:
リーリーこのプログラムがどのように機能するか:
1.チャンネルの作成
2. goroutine を作成します (開始せず、初期化のみ)
3. 印刷: 番号を書き留めます: 10
4. チャンネル 10 に録音します。キー機能をロックします。
####5. 最も重要なことはブロックされることです。 sum ゴルーチンを開始します。6. 合計関数を出力: Func 'sum' start
7. 合計関数がループ内で実行され、次のように出力されます: "To begin"
8. "ch" から数値 10 を読み取り、次のように出力します: "Read from ch: 10"
9.次のステップ。 「完了」と出力し、次の繰り返しに進みます。
###10。 「で始まる」を印刷し、「で」と書いてみます。しかし、チャンネルは空です。クォータを停止して本線に入ります
###...何回も何回も。それでは、私が見たいのは:
リーリー
しかし、私は次のことを目にしました:リーリー ###どうすればいいの? main 関数は、読み取りを行わずにチャネルに 2 回書き込みます。
また、次のコール数を変更する場合:
リーリーエラーが分かりません。しかし、誰も最後のメッセージを読みませんでした
例: このメッセージの前。
解決策
Goroutine は同時に実行されます。複数のコアを備えたシステムでは、それらを並行して実行できます。詳細は、Go ランタイムのスケジューラー実装によって異なります。チャネル通信などの同期操作を除いて、あらゆる意図と目的において、物事はランダムな順序で発生します。
これは当てはまらず、実際に起こっていることでもありません (チャネルがバッファリングされていない限り)。 Println 呼び出しは送信操作の前に発生し、メインの Goroutine は印刷後、合計 Goroutine が受信できる状態になるまでブロックされます。
「Read from ch: 30」と表示されるかどうかもランダムです。メインブロックはそれが実行されるまでブロックされるため、対応する受信操作が実行される必要があります。ただし、受信が発生した後、Println より前に main が戻る可能性があり、他の goroutine の存在に関係なく、main が戻るとプログラムはすぐに終了します。チャネルがバッファリングされている場合、この問題が発生する可能性が高くなります。
しかし、実際にはそうではありません。受信者が 2 つしかない場合は、常にデッドロックが発生します:
https://go.dev/play/p/ qFVh529mkqR以上がチャネルを使用する場合、ゴルーチンの実行順序はどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...
