メイン出口またはミラーリングされたクエリリターンでの未解決のゴルーチン
Go プログラミング言語の本のコード スニペットを考えてみましょう。ゴルーチンは取得のために生成されます。複数の URL からの応答。メインのゴルーチンは、応答チャネルから最も速い応答を受信した後に終了します。疑問が生じます: メインまたは親のゴルーチンが終了または戻ると、未完了のゴルーチンはどうなりますか?
メイン ゴルーチンの終了
通常の状況でメインのゴルーチンが終了したとき (が返される)、ランタイム システム全体がシャットダウンします。その結果、バッファなしチャネルまたはフルチャネルでの送信を待機中にスタックしたゴルーチンは、キャンセル、実行、または待機することなく突然存在しなくなります。これは、フラッシュ ペーパーが点火されるのと似ています。
他のコンテキストでの閉じられていない、または解放されていないリソースに似て、これをゴルーチン リークと呼ぶこともあります。ただし、プロセス全体が終了するため、実際のリークは発生しません。リソースは無期限に保持されるわけではありません。システムは基本的に、簡単なクリーンアップを実行します。
実行中のメイン ゴルーチンによるミラーリングされたクエリ リターン
メイン ゴルーチンが終了しておらず、mirroredQuery() 関数が返された場合、残りのゴルーチンは実行を続けるか、タスクを完了して戻るまで待機します。これには、応答の待機、応答のチャネルへの送信、および返信が含まれます。戻ると、チャネルは終了して蒸発します。
チャネル自体は文字列を保持しながら存在し続けますが、これは軽微なリソース リークと考えられます。ただし、このリークはチャネルへの最後の参照が消えると解決され、チャネル (およびそのコンテンツ) がガベージ コレクションされるようになります。
バッファリングされていないチャネル
コード スニペット内のチャネルがバッファリングされていない場合、チャネルに送信しようとすると、遅いゴルーチンがブロックされてしまいます。これにより、番組の終了が防止され、番組が終了するまでチャネルとリソースが割り当てられたままになります。この状況は望ましくありません。
バッファリングされたチャネルと最もクリーンなコード
コード スニペットでバッファリングされたチャネルを使用することは、潜在的なエラーやエラーを発生させずに目的の機能を保証する最も簡単な方法です。リソースの漏れ。これにより、遅いゴルーチンがタスクを完了し、正常に終了することができます。
結論
メイン出口での未完了のゴルーチンの運命は突然終了します。メインの goroutine がまだ実行中にミラーリングされたクエリが返されると、残りの goroutine はタスクを終了して蒸発します。バッファリングされたチャネルを使用すると、このコンテキストで未完了のゴルーチンに関連する潜在的なリソース リークが解決されます。
以上がメインの Go ルーチンが終了すると、未完了のゴルーチンはどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。