Go プレイグラウンドでコードを実行する場合、開発者はローカル マシンで同じコードを実行する場合と比較して不一致に遭遇する可能性があります。この記事では、特にゴルーチンと同期メカニズムを扱う場合の動作の違いについて説明します。
次の Go コードを考えてみましょう:
package main
import (
"fmt"
)
func other(done chan bool) {
done Go プレイグラウンドでは、このコードは「プロセスに時間がかかりすぎました」というエラーを生成します。これは、他の関数内で作成されたゴルーチンが無期限に実行されることを示唆しています。
ただし、複数の CPU コア (GOMAXPROCS > 1) を備えたローカル マシンで同じコードを実行すると、次の出力が生成されます。
Hello, playground
Finished.
これは、メインのゴルーチンが終了すると、他のゴルーチン内で作成されたゴルーチンが終了することを意味します。
動作ギャップの説明
Go プレイグラウンドとローカル マシン間の動作の違いこれは、使用可能なプロセッサの数に起因すると考えられます。 Go プレイグラウンドでは、GOMAXPROCS のデフォルトは 1 です。これは、一度に 1 つの goroutine のみを実行できることを意味します。したがって、上記の例では、other 内で作成された無限の goroutine によって、メインの goroutine の続行が妨げられます。
対照的に、複数の CPU コアでローカルで実行する場合、GOMAXPROCS はデフォルトで使用可能なコアの数を設定し、複数の goroutine が実行できるようにします。同時に実行します。したがって、other 内で作成された無限のゴルーチンは、メインのゴルーチンの終了をブロックしません。
結論
Go のゴルーチンの動作は、使用可能なプロセッサ (GOMAXPROCS) の数に依存します。 Go プレイグラウンドではデフォルト値 1 が使用されており、ゴルーチンが無限に実行されているように見える可能性がありますが、複数のコアを備えたローカル マシンで同じコードを実行すると、メインのゴルーチンが終了するときにゴルーチンが終了する可能性があるという異なる動作が提供されます。この理解は、開発者が誤解を回避し、コードがさまざまな環境で期待どおりに動作することを保証するのに役立ちます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3