WaitGroup.Wait() の時間指定待機
Go では、WaitGroup タイプを使用して、すべてのゴルーチンがタスクを完了するまで複数のゴルーチンを同期します。 。 WaitGroup.Wait() メソッドは、グループのすべてのメンバーが完了を通知するか、コンテキストがキャンセルされるまでブロックします。
ただし、スケジューラが実行されないように、WaitGroup 待機操作にタイムアウトを課すことが望ましい場合があります。誤った労働者を無期限に待つ必要がなくなります。これにより、このようなエラーが存在する場合のシステムの信頼性と回復可能性に関する哲学的な疑問が生じますが、この議論はこの質問の範囲を超えています。
解決策
提供されているソリューションは、チャネルと select ステートメントを利用してタイムアウト機能を実現します。
c := make(chan struct{}) go func() { defer wg.Done() // Do the work c <- struct{}{} }() select { case <-c: // Work completed case <-time.After(timeout): // Timed out }
このソリューションは効果的ですが、複雑すぎるように見えるかもしれません。次のヒントでこの問題を改善できます。
ヘルパー関数
プロセスを簡略化するために、タイムアウト ロジックをカプセル化するヘルパー関数を作成できます:
func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool { c := make(chan struct{}) go func() { defer close(c) wg.Wait() }() select { case <-c: return false // Completed normally case <-time.After(timeout): return true // Timed out } }
この関数はタイムアウト機能をラップしており、 use:
if waitTimeout(&wg, time.Second) { fmt.Println("Timed out waiting for wait group") } else { fmt.Println("Wait group finished") }
このアプローチは、WaitGroup.Wait() 操作のタイムアウトを処理するためのよりクリーンで便利な方法を提供します。
以上がGo で WaitGroup.Wait() の時間指定待機を実装する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。