Go 프로그램 교착 상태: "throw: 모든 고루틴이 잠자기 상태입니다."
Go 프로그램에서 두 개 이상의 고루틴( 동시에 실행 중인 기능)은 서로 완료될 때까지 무기한 대기합니다. 다음 프로그램에서 볼 수 있듯이 채널 작업 시 이러한 상황이 발생할 수 있습니다.
package main import ( "fmt" ) func total(ch chan int) { res := 0 for iter := range ch { res += iter } ch <- res } func main() { ch := make(chan int) go total(ch) ch <- 1 ch <- 2 ch <- 3 fmt.Println("Total is ", <-ch) }
이 프로그램을 실행하면 패닉 메시지가 표시됩니다.
throw: all goroutines are asleep - deadlock!
이 문제의 근본 원인 교착상태는 전체 고루틴이 (ch)에서 수신하는 것과 동일한 채널로 값을 다시 보내려고 시도한다는 사실에 있습니다. 채널이 닫히지 않았기 때문에(신호 완료) 전체 고루틴의 범위 루프가 무기한 계속되어 더 이상의 전송 또는 수신을 차단합니다.
이 문제를 해결하려면 결과를 수신할 다른 채널을 도입할 수 있습니다. 업데이트된 프로그램은 다음과 같습니다.
package main import ( "fmt" ) func total(in chan int, out chan int) { res := 0 for iter := range in { res += iter } out <- res // Send result on separate channel } func main() { ch := make(chan int) rch := make(chan int) // New channel to receive result go total(ch, rch) ch <- 1 ch <- 2 ch <- 3 close(ch) // Explicitly close channel to end loop in `total` result := <-rch // Wait for result on `rch` fmt.Println("Total is ", result) }
별도의 채널에 결과를 전송하고 원래 채널을 닫음으로써 교착 상태를 깨고 기본 고루틴이 계산된 합계를 수신할 수 있습니다.
위 내용은 My Go 프로그램이 '모든 고루틴이 잠자기 상태입니다' 오류와 함께 교착 상태에 빠지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!