ホームページ  >  記事  >  バックエンド開発  >  go ルーチンがこのように動作するのはなぜですか?

go ルーチンがこのように動作するのはなぜですか?

WBOY
WBOY転載
2024-02-08 23:30:10759ブラウズ

为什么 go 例程会有这样的行为?

phpエディタのXiguaが「goルーチンの動作の理由」についての質問に答えます。 Go 言語のルーチン (ゴルーチン) は、同時実行の効果を実現できる軽量の同時実行メカニズムです。ただし、場合によっては、go ルーチンの動作により予期しない結果が生じる可能性があります。これは主に、go ルーチンのスケジューリング メカニズムとメモリ モデルの特性によるものです。 Go 言語の日常的な動作を深く理解する前に、これらの機能とそれがプログラムの動作に与える影響を理解する必要があります。

質問の内容

「Go in action」という本を読んでいますが、その本の goroutine の部分について少し混乱しています。基本的に、次のコードのもの:

リーリー

出力は次のとおりです:

リーリー
  1. なぜ最初にゴルーチン B を実行するのでしょうか?コードではゴルーチン A が最初にあるので、これも最初に実行する必要があります。
  2. ゴルーチン B は .Gosched メソッドを使用してゴルーチン A の実行を開始しますが、ミューテックスがロックされているため、ゴルーチン A はロックが解除されるまで待機します。このとき、GOMAXPROCS の論理プロセッサが 1 つだけになるように設定したのですが、2 つのゴルーチンが並列実行されているように見えるのはなぜですか?本当にこんなことが起こってよいのでしょうか?

先ほども述べたように、 gomaxprox を 1 に設定すると、一度に 1 つの Goroutine のみを実行できますが、この場合はそうではないようで、実際には両方の Goroutine が並行して実行されています。

解決策

Goroutine は同時に実行されます。これは、使用可能なプロセッサがある場合、スケジューラはそれらを並行して実行するようにスケジュールできることを意味します。使用可能なプロセッサが 1 つだけの場合でも、プロセッサは同時に実行されますが、常に 1 つの goroutine のみが実行されます。

Go ランタイムは、どの goroutine が最初に実行されるかについて保証しません。したがって、新しく作成されたゴルーチンのグループの実行順序はランダムです。

以上がgo ルーチンがこのように動作するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。