> 백엔드 개발 > Golang > My Go 프로그램이 '모든 고루틴이 잠자기 상태입니다' 오류와 함께 교착 상태에 빠지는 이유는 무엇입니까?

My Go 프로그램이 '모든 고루틴이 잠자기 상태입니다' 오류와 함께 교착 상태에 빠지는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-23 02:11:14
원래의
907명이 탐색했습니다.

Why Does My Go Program Deadlock with the

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿