>백엔드 개발 >Golang >Go에서 WaitGroup.Wait()에 대한 시간 초과를 구현하는 방법은 무엇입니까?

Go에서 WaitGroup.Wait()에 대한 시간 초과를 구현하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-12 17:17:01978검색

How to Implement a Timeout for WaitGroup.Wait() in Go?

WaitGroup.Wait()의 시간 초과: 관용적 접근 방식

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
    }
}
  • 대기 그룹이 완료되면 신호를 보내는 채널(c)이 생성됩니다. wait.
  • wg.Wait()를 호출하고 완료되면 채널을 닫는 goroutine이 생성됩니다.
  • select 문은 채널이 닫히거나 시간 초과가 발생하는지 수신 대기합니다.
  • 채널이 닫히면 함수는 false를 반환하여 정상 완료를 나타냅니다.
  • 타임아웃에 도달하면 함수는 반환됩니다. true, 시간 초과를 나타냅니다.

권장 솔루션 단순화

더 간단한 구현을 위해 다음을 고려하십시오.

  • 대신 신호 완료를 위해 채널을 닫습니다.
  • 함수가 종료되더라도 채널을 닫으려면 defer를 사용하세요.
  • 하나의 작업만 기다려야 하는 경우 대기 그룹을 제거하세요.
  • 변환 없이 직접 기간을 사용하세요(예: time.Second).

대체 접근 방식: 취소 가능한 컨텍스트 사용

대체 접근 방식은 취소 가능한 컨텍스트를 사용하는 것입니다. 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
    }
}
  • 취소 가능한 컨텍스트(ctx)가 생성됩니다.
  • 컨텍스트가 취소될 때 신호를 보내는 데 채널(ctxDone)이 사용됩니다.
  • 대기 그룹을 기다리고 ctxDone 채널에 신호를 보내기 위해 고루틴이 생성됩니다.
  • 선택 문은 컨텍스트가 취소되거나 대기 그룹이 완료되는지 수신합니다.
  • 컨텍스트가 취소되면 대기 그룹이 이미 대기를 완료했는지 여부에 따라 함수가 반환됩니다.

위 내용은 Go에서 WaitGroup.Wait()에 대한 시간 초과를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.