고루틴 교착 상태 해결
이 시나리오에서는 Go 동시성 코드에서 교착 상태 오류가 발생했습니다. 문제를 자세히 살펴보고 효율적인 솔루션을 제공하겠습니다.
생산자와 소비자의 행동 불일치로 인해 오류가 발생합니다. 생산자 기능에 구현된 생산자는 제한된 기간 동안 채널 ch에 값을 전송합니다. 그러나 주 함수에 있는 소비자는 무한정 실행되어 ch로부터 값을 수신하려고 끝없이 시도합니다.
이 교착 상태를 해결하려면 소비자가 생산자의 완성을 존중하는지 확인해야 합니다. 이는 생산자가 값 전송을 완료하면 소비자가 자동으로 종료되어야 함을 의미합니다.
효과적인 접근 방식 중 하나는 sync.WaitGroup을 활용하여 생산자를 조정하는 것입니다. 대기 그룹을 사용하면 제작자의 진행 상황을 추적하고 채널을 닫기 전에 제작자가 작업을 완료할 때까지 기다릴 수 있습니다. 다음은 향상된 버전의 코드입니다.
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)
}
}
이 업데이트된 코드에서는 sync.WaitGroup을 사용하여 활성 생산자 수를 추적합니다. 생산자는 값 전송이 완료되면 wg.Done()을 호출하여 대기 그룹을 줄입니다. 기본 고루틴은 모든 생산자가 wg.Wait() 사용을 완료할 때까지 기다린 다음 ch 채널을 닫습니다.
sync.WaitGroup을 활용하여 소비자가 완료 상태를 존중할 수 있는 조정 메커니즘을 설정합니다. 교착상태 오류를 효과적으로 해결합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3