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 중국어 웹사이트의 기타 관련 기사를 참조하세요!