동시성 교착 상태 오류: "throw: All Goroutines Are Asleep"
Go에서 동시성으로 작업할 때 모든 경우 교착 상태가 발생할 수 있습니다. 고루틴은 서로가 작업을 수행하기를 기다리고 있습니다. 이 문제와 관련된 일반적인 오류 중 하나는 "throw: all goroutines 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) }
이 프로그램을 실행할 때 "throw: 모든 고루틴이 잠자기 상태입니다. 교착 상태입니다!"라는 오류가 발생합니다. 그 이유는 ch 채널을 닫지 않기 때문에 total 함수의 범위 루프가 절대 종료되지 않기 때문입니다. 결과적으로, main 함수에서 결과를 받기를 기다리는 고루틴은 결코 결과를 받지 못합니다.
교착 상태 해결
이 교착 상태를 해결하려면 종료해야 합니다. 더 이상 값이 전송되지 않음을 나타내는 ch 채널입니다. 또한 별도의 채널을 사용하여 결과를 다시 보낼 수 있으므로 동일한 채널에서 직접 보내고 받는 것을 방지할 수 있습니다.
아래 수정된 프로그램은 이러한 문제를 해결합니다.
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) }
종료함으로써 ch 채널을 사용하고 결과에 대해 별도의 rch 채널을 사용하여 교착 상태를 제거하고 프로그램이 올바르게 실행되도록 합니다.
위 내용은 Go 동시성 교착 상태를 해결하는 방법: '모든 고루틴이 잠자기 상태입니다'?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!