> 백엔드 개발 > Golang > Go Deadlocks: '모든 고루틴이 잠자기 상태입니다' 오류를 피하는 방법은 무엇입니까?

Go Deadlocks: '모든 고루틴이 잠자기 상태입니다' 오류를 피하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-27 13:06:18
원래의
836명이 탐색했습니다.

Go Deadlocks: How to Avoid the

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

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