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 채널이 버퍼링되지 않았기 때문에 발생합니다. 결과적으로 채널에 값을 보내려고 하면 무한정 차단되어 수신자를 기다리게 됩니다.
교착 상태 수정
교착 상태를 해결하려면, 두 가지 옵션이 있습니다:
버퍼 채널 사용:
make(chan)의 두 번째 인수로 크기를 지정하여 버퍼 채널을 생성할 수 있습니다. , 다음과 같습니다.
file1chan := make(chan string, 1) // buffer size of one
버퍼링된 채널은 배열처럼 작동하며, 채널에 사용 가능한 용량이 있는 경우 발신자가 차단하지 않고 값을 보낼 수 있습니다.
새 고루틴 사용:
새 고루틴을 시작하여 버퍼링되지 않은 채널에 값을 보낼 수 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!