>백엔드 개발 >Golang >Go 프로그램에서 \'치명적인 오류: 모든 고루틴이 잠자기 상태입니다. 교착 상태!\'가 발생하는 이유는 무엇이며 어떻게 해결할 수 있나요?

Go 프로그램에서 \'치명적인 오류: 모든 고루틴이 잠자기 상태입니다. 교착 상태!\'가 발생하는 이유는 무엇이며 어떻게 해결할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-17 02:23:03258검색

Why do Go programs encounter the

Go: Deadlock Panic - 원인 이해 및 해결

Go에서 흔히 발생하는 오류는 "치명적인 오류: 모든 고루틴은 자고 있어 - 교착 상태야!" 고루틴 간의 통신을 관리하려고 할 때. 이 오류는 고루틴이 모두 서로의 진행을 기다리는 상태에 갇힐 때 발생합니다.

문제 설명

읽고 싶은 부분에서 다음 코드를 고려하세요. 텍스트 파일의 한 줄의 단어를 채널에 저장한 다음 개별적으로 인쇄합니다.

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    for scanner.Scan() {
        line := scanner.Text()
        parts := strings.Fields(line)
        for i := range parts {
            file1chan <- parts[i]
        }
    }
    print(file1chan)
}

func print(in <-chan string) {
    for str := range in {
        fmt.Printf("%s\n", str)
    }
}

교착 상태의 원인

이 코드를 실행하면 , 교착 상태 오류가 발생합니다. 이는 file1chan 채널이 버퍼링되지 않았기 때문에 발생합니다. 결과적으로 채널에 값을 보내려고 하면 무한정 차단되어 수신자를 기다리게 됩니다.

교착 상태 수정

교착 상태를 해결하려면, 두 가지 옵션이 있습니다:

  1. 버퍼 채널 사용:
    make(chan)의 두 번째 인수로 크기를 지정하여 버퍼 채널을 생성할 수 있습니다. , 다음과 같습니다.

    file1chan := make(chan string, 1) // buffer size of one

    버퍼링된 채널은 배열처럼 작동하며, 채널에 사용 가능한 용량이 있는 경우 발신자가 차단하지 않고 값을 보낼 수 있습니다.

  2. 새 고루틴 사용:
    새 고루틴을 시작하여 버퍼링되지 않은 채널에 값을 보낼 수 있습니다.

    file1chan := make(chan string)
    go func() { // start a new goroutine that sends strings down file1chan
        for scanner.Scan() {
            line := scanner.Text()
            parts := strings.Fields(line)
            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    
    print(file1chan)

    이 접근 방식을 사용하면 새 고루틴이 값 전송 책임을 맡습니다. 주요 고루틴은 인쇄에 중점을 둡니다.

이러한 솔루션 중 하나를 구현하면 교착 상태를 효과적으로 제거하고 고루틴 간의 원활한 통신이 가능해집니다.

위 내용은 Go 프로그램에서 \'치명적인 오류: 모든 고루틴이 잠자기 상태입니다. 교착 상태!\'가 발생하는 이유는 무엇이며 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.