ホームページ  >  記事  >  バックエンド開発  >  Go Goroutine の動作がプレイグラウンドとローカル実行で異なるのはなぜですか?

Go Goroutine の動作がプレイグラウンドとローカル実行で異なるのはなぜですか?

DDD
DDDオリジナル
2024-10-23 14:35:33458ブラウズ

Why Do Go Goroutine Behaviors Differ Between the Playground and Local Execution?

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 Playground:

  • エラーが発生しました:「プロセスに時間がかかりすぎました」 ."
  • 他の内の goroutine が永続的に実行されることを意味します。

ローカル実行:

  • ほぼ生成された出力瞬時に:

    Hello, playground.
    Finished.
  • 他のゴルーチンがメインのゴルーチンの完了時に終了することを示します。

説明

Go Playground:

  • デフォルトの GOMAXPROCS は 1 に設定されています。
  • 一度に 1 つの goroutine だけが実行され、goroutine がノンブロッキングの場合はスケジューラーの切り替えが防止されます。
  • メインの goroutine は、完了チャネルからのメッセージを待機してブロックします。
  • 他の内の goroutine は無限に実行され、タイムアウトが発生します。

ローカル実行:

  • GOMAXPROCS は CPU コアの数に設定される可能性が高く、通常はデフォルトで 1 より大きい値に設定されます。
  • スケジューラは goroutine 間を切り替え、メインの goroutine が非処理でも進行できるようにします。 - 同時に実行されている goroutine をブロックします。
  • main() が終了すると、プログラムは無期限に実行されている goroutine の完了を待たずに終了します。

非決定的な動作

現在、Go Playground はキャッシュされたバージョンの出力を使用しているため、後続の実行では実際の実行が正確に反映されない可能性があることに注意してください。

結論

GOMAXPROCS が goroutine の実行に与える影響を理解することは、設計にとって重要です。適切な同時実行モデル。 Go プレイグラウンドのデフォルト設定は、ローカル マシンの動作を常に模倣するとは限りません。これは、さまざまな構成でテストすることの重要性を強調しています。

以上がGo Goroutine の動作がプレイグラウンドとローカル実行で異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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