ホームページ  >  記事  >  バックエンド開発  >  Go プログラムで Goroutine が実行されないのはなぜですか?

Go プログラムで Goroutine が実行されないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-02 18:46:02571ブラウズ

Why Doesn't My Goroutine Execute in My Go Program?

Goroutine 実行異常

ユーザーは、Go プログラムで Goroutine の実行に失敗するという複雑な状況に遭遇しました。匿名関数を使用してゴルーチンを作成し、メイン関数内のチャネルにメッセージを送信しているにもかかわらず、「ゴルーチンに入る...」という期待される出力がありません。

提供されたコードを検査すると、ゴルーチンが実際に存在していることがわかります。メッセージチャネルを作成してポインタを渡しました。ただし、問題はプログラムのその後の実行フローにあります。

同期の欠如

重大な問題は、main 関数とゴルーチンの間に同期が存在しないことです。プログラムは、Goroutine が実行を継続するメカニズムを提供せずに、「Done!」を出力した後に終了します。

Go を使用すると、Goroutine をメイン プログラムと同時に実行できます。ただし、ゴルーチンがタスクを完了する前に main 関数が終了した場合、ゴルーチンは途中で終了します。

考えられる解決策

この問題を解決するには、プログラムで実装する必要があります。 main 関数が goroutine の終了を確実に待機するようにする同期メカニズム。これは、さまざまなアプローチで実現できます。

  • チャネルで待機: 作成されたゴルーチンの数に等しい特定の数のメッセージを待機する別のチャネルを作成します。 main 関数は、すべてのメッセージが受信され、すべての goroutine の完了を示すまで、このチャネルでブロックできます。
  • sync.WaitGroup: sync.WaitGroup を使用して、アクティブな goroutine の数を追跡し、各ゴルーチンが完了したときにそれをデクリメントします。 main 関数は、WaitGroup.Wait() を呼び出して、カウントが 0 に達するまでブロックし、すべてのゴルーチンが終了したことを確認します。
  • Select ステートメント: select ステートメントを使用して、両方の入力を待機します。メッセージ チャネルと「完了」チャネル。メッセージ チャネルからメッセージを受信したら、それを処理します。 「done」チャネルからメッセージを受信したら、メッセージチャネルを閉じてゴルーチンを終了します。 main 関数は、「done」チャネルにメッセージを送信してプログラムの完了を知らせることができます。

さらなる探索

Go ブログは優れた機能を提供します。 Go の同時実行性を理解するためのリソースは、次のリンクにあります: [Go ブログ: 同時実行性](https://blog.golang.org/go-concurrency-patterns).

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

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