Golang の goroutine は、強力な同時実行メカニズムの 1 つです。 goroutine の利点は、軽量で効率的で、作成と制御が簡単であることです。しかし同時に、Goroutine を合理的にシャットダウンする方法は非常に重要な問題です。
なぜ goroutine を閉じる必要があるのでしょうか?
Goroutine の作成は非常に簡単ですが、不当に使用すると、特に長時間実行される Goroutine の場合、リソースの無駄につながります。プログラムが終了するまで goroutine が実行され続けると、システム リソースが占有され、プログラムがクラッシュしてシステム パフォーマンスに影響を与える可能性があります。
したがって、Goroutine を閉じる必要があります。通常、ゴルーチンを閉じる必要がある理由は次のとおりです。
Goroutine を閉じるにはどうすればよいですか?
GO 言語には、ゴルーチンを閉じるための複数のメカニズムが用意されています。
チャネルを使用してゴルーチンを閉じることができます。チャネルを作成し、ゴルーチンを閉じる必要があるときにデータをチャネルに送信すると、ゴルーチンはデータを読み取った後、正常に終了できます。例:
func worker(stopCh chan struct{}) { for { select { // do something... case <-stopCh: return } } } stopCh := make(chan struct{}) go worker(stopCh) // 关闭 goroutine close(stopCh)
context パッケージは、ゴルーチンをシャットダウンするためのより洗練された方法を提供します。 context.Context を作成し、必要に応じて WithCancel または WithTimeout 関数を使用してコンテキストをキャンセルし、ゴルーチンを閉じることができます。例:
func worker(ctx context.Context) { for { select { // do something... case <-ctx.Done(): return } } } ctx, cancel := context.WithCancel(context.Background()) go worker(ctx) // 关闭 goroutine cancel()
同期パッケージには、Goroutine の完了を待機できる WaitGroup が用意されています。 goroutine 実行の最後に呼び出される Done メソッドを追加できます。すべてのゴルーチンの実行が終了した場合は、Wait を使用して待機をブロックできます。例:
func worker(wg *sync.WaitGroup) { defer wg.Done() // do something... } var wg sync.WaitGroup wg.Add(1) go worker(&wg) // 等待 goroutine 执行结束 wg.Wait()
Goroutine を閉じる際の注意事項
通常は、Goroutine を直接閉じないでください。そうしないと、リソースが発生する可能性があります。リークや競合状態など。 goroutine を閉じるには、チャネル、コンテキスト、または WaitGroup を使用する必要があります。
Goroutine を設計するときは、閉じられるように設計するのが最善です。長時間実行されるゴルーチンが閉じられないように設計されている場合、それを閉じることができず、問題が発生する可能性があります。したがって、コードを記述したりゴルーチンを使用したりするときは、このことに注意してください。
システム リソースは限られており、ゴルーチンが多すぎると多くのシステム リソースを占有し、システム パフォーマンスに影響を与える可能性があります。したがって、ゴルーチンを使用する場合は、システム リソースを慎重に使用し、それらが正しく解放されていることを確認してください。
概要
Goroutine は軽量で効率的で使いやすいため、Golang のハイライトです。ただし、この機能の使用には注意が必要で、ゴルーチンを適切に閉じることは、Golang 開発において習得しなければならないスキルです。チャネル、コンテキスト、WaitGroup などのメカニズムを使用して goroutine を閉じ、リソース リークやその他の問題を回避できます。
以上がGolang で goroutine を閉じる方法 (3 つの方法)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。