ホームページ  >  記事  >  バックエンド開発  >  Go プレイグラウンドとローカル マシンのゴルーチンで動作の違いが見られるのはなぜですか?

Go プレイグラウンドとローカル マシンのゴルーチンで動作の違いが見られるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-23 17:05:01181ブラウズ

Why Do Goroutines on Go Playground and Local Machines Exhibit Behavioral Differences?

Go プレイグラウンドとローカル マシン間の不一致

Go プレイグラウンドでコードを実行する場合、開発者はローカル マシンで同じコードを実行する場合と比較して不一致に遭遇する可能性があります。この記事では、特にゴルーチンと同期メカニズムを扱う場合の動作の違いについて説明します。

ケーススタディ: 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。