ホームページ  >  記事  >  バックエンド開発  >  Go でゴルーチンが実行されないのはなぜですか?

Go でゴルーチンが実行されないのはなぜですか?

DDD
DDDオリジナル
2024-11-02 09:59:30416ブラウズ

Why is My Goroutine Not Executing in Go?

ゴルーチン実行の中断: 特定のユースケースの分析

Go プログラミングの領域では、ゴルーチンはタスクの同時実行のための強力なメカニズムを提供します。 。ただし、特定の状況下では、ゴルーチンが作成されても実行されない可能性があります。このようなシナリオの 1 つが最近、人気の Q&A プラットフォームで発生しました。そこでは、ユーザーがゴルーチンの実行に関する問題に遭遇しました。

質問で提供されたユーザーのコードは、チャネルからメッセージを読み取るゴルーチンを定義しています。

<code class="go">go func(m *chan string) {
    fmt.Println("Entering the goroutine...")
    for {
        fmt.Println(<- *m)
    }
}(&messages)</code>

しかし、コンソール出力は沈黙したままで、ゴルーチンは実行に失敗しました。ユーザーは、「ゴルーチンに入っています」というメッセージがなぜ出力されないのか疑問に思い、困惑したままになりました。

この問題を理解するには、ゴルーチンは同時に実行されている間、メインのゴルーチンに直接依存していないことを覚えておくことが重要です。プログラムの実行フロー。この特定のケースでは、ユーザーの main 関数が「Done!」を出力した直後に終了したため、ゴルーチンが実行される前に終了してしまいました。

解決策は、メイン プログラムを保持するメカニズムを導入することにあります。 goroutine がタスクを完了するまで。これは、チャネル、sync.WaitGroup、またはその他の同期プリミティブなどの手法を使用して実現できます。

以下の変更されたコードには、続行する前にゴルーチンからのシグナルを待機するチャネルが組み込まれています。

<code class="go">done := make(chan bool)

go func(m *chan string) {
    fmt.Println("Entering the goroutine...")
    for {
        fmt.Println(<- *m)
    }

    done <- true
}(&messages)

<-done</code>

この変更されたコードでは、ゴルーチンは完了するとシグナルを「done」チャネルに送信し、メインプログラムは終了する前にこのシグナルを待ちます。その結果、ゴルーチンは完全に実行され、期待どおりの出力が生成されます。

開発者は、ゴルーチンの非同期の性質を理解し、同期テクニックを利用することで、ゴルーチンが効果的に実行され、その目的を確実に達成できるようになります。 Go の同時実行モデル。

以上がGo でゴルーチンが実行されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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