Go では、誤ったワーカーが無限に待機することを防ぐために、WaitGroup.Wait() に時間制限を設定できます。 。ここでは、慣用的な実装方法と代替アプローチを詳しく説明します。
次のアプローチは、最も慣用的な解決策であると広く考えられています。
import ( "sync" "time" ) func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool { c := make(chan struct{}) go func() { wg.Wait() close(c) }() select { case <-c: return false // completed normally case <-time.After(timeout): return true // timed out } }
より単純な実装については、次の点を考慮してください。
代替アプローチには、キャンセル可能なコンテキストを使用することが含まれます。 context:
import ( "context" "sync/atomic" "sync" ) func waitWithCancel(ctx context.Context, wg *sync.WaitGroup) bool { ctxDone := make(chan struct{}) var exited int32 go func() { defer close(ctxDone) wg.Wait() atomic.StoreInt32(&exited, 1) }() select { case <-ctx.Done(): return atomic.LoadInt32(&exited) == 0 case <-ctxDone: return true } }
以上がGo で WaitGroup.Wait() のタイムアウトを実装する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。