Go의 교착 상태: WaitGroup 및 버퍼 채널
Go에서는 동시 goroutine이 서로 완료될 때까지 무기한 기다릴 때 교착 상태가 발생합니다. 교착 상태의 일반적인 원인 중 하나는 WaitGroups 및 버퍼링된 채널의 사용과 관련이 있습니다.
교착 상태의 예
다음 코드를 고려하세요.
<code class="go">package main import "fmt" import "sync" func main() { ch := make(chan []int, 4) var m []int var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() ch <- m // Sending to a full channel return }() } wg.Wait() for c := range ch { fmt.Printf("c is %v", c) } }</code>
이 코드는 5개의 빈 슬라이스를 용량이 4인 버퍼링된 채널로 보낸 다음 모든 고루틴이 완료된 후 채널에서 읽습니다. 그러나 코드에서 교착 상태 오류가 발생합니다.
교착 상태의 원인
두 가지 문제로 인해 교착 상태가 발생합니다.
해결책
교착 상태를 해결하려면 다음 수정 중 하나를 수행하십시오.
해결책 1:
채널 용량을 5(또는 그 이상)로 늘리고 모든 데이터를 보낸 후 닫습니다. :
<code class="go">ch := make(chan []int, 5) ... wg.Wait() close(ch)</code>
해결책 2:
별도의 고루틴을 시작하여 채널에서 읽고 모든 데이터가 수신되면 기본 고루틴에 알립니다.
<code class="go">func main() { ch := make(chan []int, 4) var m []int var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func() { ch <- m wg.Done() }() } go func() { for c := range ch { fmt.Printf("c is %v\n", c) wg.Done() } }() wg.Wait() }</code>
위 내용은 Go에서 WaitGroups 및 버퍼링된 채널을 사용할 때 교착 상태를 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!