Go Playground と Go on Your Machine の矛盾: Goroutine の実行
Goroutine の実行に関する混乱を解決するために、両方の環境でコード スニペットが実行されました。 Go プレイグラウンドとローカル マシン。プレイグラウンドでは「プロセスに時間がかかりすぎました」というエラーが発生し、永続的に実行される Goroutine が作成されたことを示唆していましたが、ローカル マシンではほぼ瞬時に出力が行われました。これにより、メインの Goroutine が終了したときに other() 関数内の Goroutine が終了するのか、それともバックグラウンドで実行を継続するのかという疑問が生じます。
説明
Go プレイグラウンドについて, GOMAXPROCS は 1 に設定されます。これは、一度に 1 つの Goroutine だけが実行されることを示します。ブロックしないと、スケジューラは他の Goroutine に切り替わりません。
コード内では、メインの Goroutine が開始され、done チャネルでブロックされます。スケジューラは other() Goroutine に切り替える必要があります。これにより、done チャネルで値が送信され、両方の Goroutine が実行可能になります。スケジューラは、other() の実行を継続することを選択します。 GOMAXPROCS が 1 であるため、メインのゴルーチンはブロックされたままになります。
other() は無限ループのゴルーチンを起動します。このゴルーチンは実行を継続し、メインのゴルーチンの再開を妨げます。その結果、Playground のタイムアウトが発生します。
ローカルでは、GOMAXPROCS は通常 1 を超えます。その結果、無限ループの Goroutine の実行中に、別の Goroutine (おそらくメインの Goroutine) が同時に実行されます。メインのゴルーチンが戻ると、他の非メインのゴルーチンの完了を待たずにプログラムは終了します。
Go Playground の変更
GOMAXPROCS を明示的に次のように設定することにより、 1 を Go Playground で実行すると、「処理に時間がかかりすぎます」という動作を再現することが可能です。逆に、GOMAXPROCS を 2 などのより高い値に設定すると、多くの場合、実行順序が変更され、タイムアウトなしで正常に終了します。
以上がローカルマシンで同じコードを実行中に Go Playground がタイムアウトになるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。