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

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

DDD
DDD원래의
2024-11-12 20:47:02664검색

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

WaitGroup.Wait()에 대한 시간 제한

WaitGroup.Wait()은 모든 고루틴이 완료될 때까지 기다리면서 무기한 차단할 수 있습니다. 이는 잠재적으로 실행을 무기한 차단할 수 있는 잘못된 작업자로부터 시스템을 보호하려는 경우 문제가 될 수 있습니다. WaitGroup.Wait()에 대한 시간 초과를 설정하는 관용적인 방법은 없지만 이 기능을 달성하기 위한 여러 접근 방식이 있습니다.

일반적인 접근 방식 중 하나는 채널과 고루틴을 사용하는 것입니다. 고루틴은 작업을 마치면 채널에 신호를 보냅니다. 메인 프로그램은 채널과 타이머를 선택하여 고루틴이 시간 초과되었는지 확인할 수 있습니다. 예는 다음과 같습니다.

import (
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(1)

    timeout := time.After(5 * time.Second)
    ch := make(chan struct{})

    go func() {
        defer wg.Done()
        defer close(ch)
        // Do some work
    }()

    select {
    case <-ch:
        // Goroutine finished before timeout
        wg.Wait() // Wait for all goroutines to finish
    case <-timeout:
        // Goroutine timed out
        wg.Wait() // Block until all goroutines have completed
        log.Println("Timeout occurred")
    }
}

이 솔루션은 Select 문을 사용하여 채널이나 타이머를 기다리며 WaitGroup.Wait()에 대한 시간 초과 메커니즘을 제공합니다. 기타 권장되는 최적화에는 defer 문을 사용하여 채널을 닫고 시간 초과 기간에 대해 유형이 지정되지 않은 상수를 사용하는 것이 포함됩니다.

또는 위 기능을 래핑하는 사용자 지정 도우미 함수를 사용하여 코드를 단순화하고 재사용성을 높일 수 있습니다. 예는 다음과 같습니다.

func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
    c := make(chan struct{})
    defer close(c)

    go func() {
        wg.Wait()
        c <- struct{}{}
    }()

    select {
    case <-c:
        return false // Completed normally
    case <-time.After(timeout):
        return true // Timed out
    }
}

이 함수는 다음과 같이 사용할 수 있습니다.

if waitTimeout(&wg, 5*time.Second) {
    fmt.Println("Timed out waiting for wait group")
} else {
    fmt.Println("Wait group finished")
}

이러한 접근 방식은 WaitGroup.Wait()에 대한 시간 초과를 설정하는 방법을 제공하여 다음을 보호할 수 있습니다. 잘못된 작업자로 인해 시스템이 실행을 무기한 차단합니다.

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

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