Go プレイグラウンドでコードを実行する場合、開発者はローカル マシンで同じコードを実行する場合と比較して不一致に遭遇する可能性があります。この記事では、特にゴルーチンと同期メカニズムを扱う場合の動作の違いについて説明します。
次の Go コードを考えてみましょう:
<code class="go">package main import ( "fmt" ) func other(done chan bool) { done <- true go func() { for { fmt.Println("Here") } }() } func main() { fmt.Println("Hello, playground") done := make(chan bool) go other(done) <-done fmt.Println("Finished.") }</code>
Go プレイグラウンドでは、このコードは「プロセスに時間がかかりすぎました。」というエラーを生成します。これは、他の関数内で作成されたゴルーチンが無期限に実行されることを示唆しています。
ただし、複数の CPU コア (GOMAXPROCS > 1) を備えたローカル マシンで同じコードを実行すると、次の出力が得られます:
<code class="text">Hello, playground Finished.</code>
これは、メインの goroutine が終了すると、他の goroutine 内で作成された goroutine も終了することを意味します。
Go プレイグラウンドとローカル マシン間の動作の違いは、利用可能なプロセッサの数。 Go プレイグラウンドでは、GOMAXPROCS のデフォルトは 1 です。これは、一度に 1 つの goroutine のみを実行できることを意味します。したがって、上記の例では、other 内で作成された無限の goroutine により、メインの goroutine の続行が妨げられます。
対照的に、複数の CPU コアでローカルで実行している場合、GOMAXPROCS はデフォルトで使用可能なコアの数を設定し、複数の goroutine が実行できるようにします。同時に実行します。したがって、other 内で作成された無限のゴルーチンは、メインのゴルーチンの終了をブロックしません。
Go のゴルーチンの動作は、使用可能なプロセッサ (GOMAXPROCS) の数に依存します。 Go プレイグラウンドではデフォルト値 1 が使用されており、ゴルーチンが無限に実行されているように見える可能性がありますが、複数のコアを備えたローカル マシンで同じコードを実行すると、メインのゴルーチンが終了するときにゴルーチンが終了する可能性がある異なる動作が提供されます。この理解は、開発者が誤解を回避し、異なる環境でもコードが期待どおりに動作することを保証するのに役立ちます。
以上がGo プレイグラウンドとローカル マシンのゴルーチンで動作の違いが見られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。