Go의 교착 상태: "throw: 모든 고루틴이 잠들어 있습니다."
Go 프로그램에서는 두 개 이상의 고루틴이 대기할 때 교착 상태가 발생합니다. 서로 끝내려고 하다가 더 이상 진전이 없는 얼어붙은 상태가 됩니다. 이 문제는 종종 "throw: all goroutine are sleep - deadlock!"으로 보고됩니다.
이 교착 상태가 발생하는 이유를 이해하기 위해 단순화된 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) }
이 프로그램에서 total 함수는 ch 채널을 통해 전송된 숫자의 합을 계산하고 결과를 동일한 채널로 다시 보냅니다. 교착 상태는 다음 조건이 충족되기 때문에 발생합니다.
이로 인해 두 고루틴(누계 및 고루틴 모두)이 발생하는 교착 상태 상황이 발생합니다. main)이 다른 작업을 기다리고 있어 "throw: all goroutines are sleep" 오류가 발생합니다.
이 교착 상태를 해결하려면, 마지막 값을 보낸 후 main 함수에서 ch 채널을 닫을 수 있습니다:
ch <- 3 close(ch)
채널을 닫으면 총 고루틴에 더 이상 입력이 없다는 신호를 보내 계산을 완료하고 결과를 보낼 수 있습니다. 채널로 돌아오세요
위 내용은 Go Deadlock: 'throw: 모든 고루틴이 잠자기 상태'가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!