> 백엔드 개발 > Golang > Go Deadlock: 'throw: 모든 고루틴이 잠자기 상태'가 발생하는 이유는 무엇입니까?

Go Deadlock: 'throw: 모든 고루틴이 잠자기 상태'가 발생하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-02 15:03:39
원래의
558명이 탐색했습니다.

Go Deadlock: Why Does

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 채널을 통해 전송된 숫자의 합을 계산하고 결과를 동일한 채널로 다시 보냅니다. 교착 상태는 다음 조건이 충족되기 때문에 발생합니다.

  • for 루프 내부의 전체 함수 블록은 ch(range 키워드 사용)를 통해 추가 입력을 기다리고 있습니다.
  • 주 함수는 다음을 보냅니다. 세 개의 값을 ch에 할당하지만 채널을 닫지는 않습니다.
  • total 함수는 여전히 추가 입력을 기다리고 있으므로 결과를 다시 보내지 않습니다. ch.
  • ch.

이로 인해 두 고루틴(누계 및 고루틴 모두)이 발생하는 교착 상태 상황이 발생합니다. main)이 다른 작업을 기다리고 있어 "throw: all goroutines are sleep" 오류가 발생합니다.

이 교착 상태를 해결하려면, 마지막 값을 보낸 후 main 함수에서 ch 채널을 닫을 수 있습니다:

ch <- 3
close(ch)
로그인 후 복사

채널을 닫으면 총 고루틴에 더 이상 입력이 없다는 신호를 보내 계산을 완료하고 결과를 보낼 수 있습니다. 채널로 돌아오세요

위 내용은 Go Deadlock: 'throw: 모든 고루틴이 잠자기 상태'가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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