Go의 교착 상태: "throw: 모든 고루틴이 잠자기 상태입니다."
실행 중인 모든 고루틴이 서로 대기할 때 고루틴 교착 상태가 발생합니다. 완벽한. 제공된 Go 코드에서는 닫히지 않은 채널 ch로 인해 교착 상태가 발생합니다.
total 함수는 범위 루프를 사용하여 ch 채널에서 지속적으로 새 값을 기다립니다. ch 채널은 결코 닫히지 않으므로 루프는 종료되지 않습니다. 이는 이 함수 실행을 담당하는 고루틴이 결코 끝나지 않는다는 것을 의미합니다.
그동안 메인 함수에서 프로그램은 ch 채널에 값을 보내고 결과를 수신하려고 시도합니다. 하지만 전체 고루틴은 무한정 대기하기 때문에 보낸 값을 처리하고 결과를 다시 보낼 수 없습니다. 이로 인해 프로그램이 교착 상태에 빠지게 됩니다.
이 교착 상태를 해결하려면 모든 값을 보낸 후 ch 채널을 닫아야 합니다. 이는 새 값에 대한 대기를 중지하고 결과를 계산하도록 total 함수에 신호를 보냅니다.
다음은 채널 폐쇄가 포함된 코드의 수정된 버전입니다.
package main import ( "fmt" ) func total(in chan int, out chan int) { res := 0 for iter := range in { res += iter } out <- res // sends back the result } func main() { ch := make(chan int) rch := make(chan int) go total(ch, rch) ch <- 1 ch <- 2 ch <- 3 close(ch) // this will end the loop in the total function result := <-rch // waits for total to give the result fmt.Println("Total is ", result) }
이제 goroutine 실행 합계 합산을 올바르게 수행하고 결과를 다시 메인으로 보내 교착 상태를 방지합니다.
위 내용은 Go Deadlocks: '모든 고루틴이 잠자기 상태입니다' 오류를 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!