Go ルーチンを操作する場合、効果的に終了する方法を知ることが不可欠になります。次の設定を考えてみましょう:
<code class="go">func startsMain() { go main() } func stopMain() { // TODO: Kill main } func main() { // Infinite loop }</code>
この設定では、main という名前のゴルーチンに無限ループが作成されます。ループを終了するには、stopMain から goroutine を制御する方法が必要です。
を使用する goroutine を強制終了する効果的な方法の 1 つは、channel と select ステートメントを使用することです。
<code class="go">var quit chan struct{} func startLoop() { quit := make(chan struct{}) go loop(quit) } func stopLoop() { close(quit) } func loop(quit chan struct{}) { for { select { case <-quit: return default: // Do stuff } } }</code>
この例では、quit という名前のサイズ 0 のチャネル (chan struct{}) を使用して、ゴルーチンに停止の信号を送ります。ループ関数は、select ステートメントを使用して終了チャネルを繰り返しチェックします。 quit が値 (停止リクエストを示す) を受け取ると、ループは終了します。
Go は、ゴルーチンを処理するための追加の同時実行パターンを提供します。これらのパターンの詳細については、Go ブログをご覧ください。
CPU の枯渇を避けながら関数を定期的に実行するには、ティッカーを使用できます。
<code class="go">import "time" // [...] func loop() { ticker := time.NewTicker(2 * time.Second) defer ticker.Stop() for { select { case <-quit: return case <-ticker.C: // Do stuff } } }</code>
この場合、quit が値を受け取るかティッカーが起動するまでブロックを選択し、指定された間隔で関数を実行できるようにします。
以上がGo で Goroutine を効果的に終了するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。