ホームページ  >  記事  >  バックエンド開発  >  Go プレイグラウンドとローカル マシン間でゴルーチンの動作はどのように異なりますか?

Go プレイグラウンドとローカル マシン間でゴルーチンの動作はどのように異なりますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-23 17:42:24452ブラウズ

How Do Goroutines Behave Differently Between Go Playground and Local Machine?

Go Playground とローカル マシン上の Go の不一致

問題: Go Playground とローカル マシンのゴルーチン

ゴルーチンに関する誤解を解くために、このコードは 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 サイトの他の関連記事を参照してください。

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