> 백엔드 개발 > Golang > sync.WaitGroup을 사용하여 Go 동시성에서 교착 상태를 방지하는 방법은 무엇입니까?

sync.WaitGroup을 사용하여 Go 동시성에서 교착 상태를 방지하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-25 08:53:02
원래의
300명이 탐색했습니다.

How to Prevent Deadlock in Go Concurrency with sync.WaitGroup?

고루틴 교착 상태 해결

이 시나리오에서는 Go 동시성 코드에서 교착 상태 오류가 발생했습니다. 문제를 자세히 살펴보고 효율적인 솔루션을 제공하겠습니다.

이 오류는 생산자와 소비자의 행동 불일치로 인해 발생합니다. 생산자 기능에 구현된 생산자는 제한된 기간 동안 채널 ch에 값을 전송합니다. 하지만 메인 함수에 있는 컨슈머는 끝없이 ch로부터 값을 받으려고 무한히 실행됩니다.

이 교착 상태를 해결하려면 컨슈머가 프로듀서의 완성을 존중하는지 확인해야 합니다. 이는 생산자가 값 전송을 완료하면 소비자가 자동으로 종료되어야 함을 의미합니다.

효과적인 접근 방식 중 하나는 sync.WaitGroup을 활용하여 생산자를 조정하는 것입니다. 대기 그룹을 사용하면 제작자의 진행 상황을 추적하고 채널을 닫기 전에 제작자가 작업을 완료할 때까지 기다릴 수 있습니다. 향상된 코드 버전은 다음과 같습니다.

<code class="go">func main() {
    var wg sync.WaitGroup
    ch := make(chan int)

    wg.Add(1)
    go producer(ch, 100*time.Millisecond, 2, &wg)

    wg.Add(1)
    go producer(ch, 200*time.Millisecond, 5, &wg)

    // Start a goroutine to close the channel when all producers are done
    go func() {
        wg.Wait()
        close(ch)
    }()

    // Use a for range loop to receive values from the channel
    for v := range ch {
        fmt.Println(v)
    }
}</code>
로그인 후 복사

이 업데이트된 코드에서는 sync.WaitGroup을 사용하여 활성 생산자 수를 추적합니다. 생산자는 값 전송이 완료되면 wg.Done()을 호출하여 대기 그룹을 줄입니다. 기본 고루틴은 모든 생산자가 wg.Wait() 사용을 완료할 때까지 기다린 다음 ch 채널을 닫습니다.

sync.WaitGroup을 활용하여 소비자가 완료 상태를 존중할 수 있는 조정 메커니즘을 설정합니다. 교착상태 오류를 효과적으로 해결합니다.

위 내용은 sync.WaitGroup을 사용하여 Go 동시성에서 교착 상태를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿