ゴルーチンに関する誤解を解くために、このコードは 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 プレイグラウンドでは、「プロセスに時間がかかりすぎました。」というエラーが発生しました。これは、他のゴルーチン内で作成されたゴルーチンが無期限に実行されることを示唆しています。
ただし、同じコードをローカルで実行すると、次の即時出力が生成されます。
<code class="go">Hello, playground. Finished.</code>
これは、メインのゴルーチンが終了したときに他のゴルーチンが終了することを意味します。
この不一致は、GOMAXPROCS のデフォルト値によるものです。
Go プレイグラウンドでは、 GOMAXPROCS が 1 に設定されています。これは、一度に 1 つの goroutine だけを実行できることを意味します。他のゴルーチン内で作成されたゴルーチンがブロックしない場合 (チャネルで待機するなど)、スケジューラは他のゴルーチンに切り替えません。
メインのゴルーチンが完了チャネルでブロックしているため、スケジューラは、他の中のゴルーチン。次に、他のゴルーチン内のゴルーチンが無限ループで別のゴルーチンを起動します。 GOMAXPROCS が 1 であるため、メインの goroutine は続行されず、無限ループが実行され続け、タイムアウトが発生します。
ローカル マシンでは、 GOMAXPROCS は通常、CPU コアの数にデフォルト設定されます。 (例: 4 または 8)。これにより、複数の goroutine を同時に実行できるようになります。メインの goroutine が Done チャネルでブロックすると、スケジューラは別の goroutine に切り替えます。これは、他のゴルーチン内のゴルーチン、または無限ループを実行しているゴルーチンである可能性があります。
メインのゴルーチンは最終的に終了するため、無限ループは実行されなくなります。したがって、プログラムは無限ループの完了を待たずに正常に終了します。
Go プレイグラウンドでゴルーチンを実行するときは、GOMAXPROCS のデフォルト値を考慮することが重要です。マルチゴルーチンの同時実行をシミュレートするには、GOMAXPROCS を runtime.GOMAXPROCS(2) などのより高い値に明示的に設定します。ローカル実行では、GOMAXPROCS のデフォルト設定では通常、予期される同時実行動作が可能です。
以上がGo プレイグラウンドとローカル マシン間でゴルーチンの動作はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。