Goroutine に終了を通知する
Go では、アプリケーションの正常なシャットダウンを確保したり、リソース割り当てを管理したりするときに、Goroutine の終了を処理することが重要になることがあります。この記事では、実行中のゴルーチンにその実行を停止するよう信号を送信する手法について説明します。
お問い合わせで提供されている例は、無限ループするゴルーチンを示し、連続処理をシミュレートしています。目標は、指定されたタイムアウトを超えた場合にこのゴルーチンを終了することです。
最初のアプローチでは、通信用とシグナリング終了用の 2 つのチャネルを使用します。ただし、シグナリング チャネルから読み取るとゴルーチンがブロックされ、本来の目的が果たせなくなります。
追加の停止チャネルの使用
効果的な解決策の 1 つは、追加の停止チャネルを導入することです。 、tooLate、タイプ chan struct{}。 goroutine 内では、select ステートメントを使用して通信チャネルと停止チャネルの両方を監視します。 tooLate チャネルが値を受け取ると、ゴルーチンは正常に戻り、その処理ループを終了します。
変更されたコード スニペットは次のとおりです:
<code class="go">func main() { // tooLate channel to signal goroutine to stop tooLate := make(chan struct{}) proCh := make(chan string) go func() { for { fmt.Println("working") time.Sleep(1 * time.Second) select { case <-tooLate: fmt.Println("stopped") return case proCh <- "processed": // Avoid blocking default: // Handle potential blocking } fmt.Println("done here") } }() // ... // Signal termination fmt.Println("too late") close(tooLate) // ... }</code>
このソリューションでは、proCh チャネルが引き続き使用されます。 tooLate チャネルは終了信号として機能します。 tooLate チャネルが閉じられると、ゴルーチンはこれを検出してループを終了します。
その他の考慮事項
追加のチャネルを使用する以外に、ゴルーチンにシグナルを送信するための代替アプローチがあります。たとえば、組み込みの sync.Cond 型を使用して goroutine 同期をより詳細に制御します。どの手法を選択するかは、アプリケーションの特定の要件によって異なります。
以上がGo で実行中のゴルーチンを正常に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。