Go 채널 및 교착 상태
Go에서는 채널을 사용하여 고루틴 간 통신을 수행합니다. 그러나 채널이 제대로 처리되지 않으면 교착 상태가 발생할 수 있습니다.
다음 코드를 고려하세요.
<code class="go">func main() { c1 := make(chan int) c2 := make(chan int) go func() { for i := range c1 { println("G1 got", i) c2 <- i } }() go func() { for i := range c2 { println("G2 got", i) c1 <- i } }() c1 <- 1 time.Sleep(1000000000 * 50) }</code>
이 코드는 기본 함수가 종료될 때까지 숫자를 무한정 인쇄합니다. 그러나 주 함수에서 채널 중 하나에 다른 값을 보내면 프로그램은 다음을 차단합니다.
<code class="go">func main() { c1 := make(chan int) c2 := make(chan int) go func() { for i := range c1 { println("G1 got", i) c2 <- i } }() go func() { for i := range c2 { println("G2 got", i) c1 <- i } }() c1 <- 1 time.Sleep(1000000000 * 1) c1 <- 2 time.Sleep(1000000000 * 50) }</code>
이는 두 번째 고루틴이 c1에 보낸 값 "2"를 수신하지 않기 때문에 발생합니다. 이러한 교착 상태가 발생하는 이유는 두 고루틴이 서로 값을 보내고 받기를 기다리며 순환 종속성을 생성하기 때문입니다.
교착 상태 디버깅
교착 상태를 디버깅하려면, 여러 접근 방식을 사용할 수 있습니다:
위 내용은 Go 채널에서 교착 상태가 어떻게 발생할 수 있으며 이를 디버깅하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!