Go: 치명적인 오류 "All Goroutines Are Asleep - Deadlock" 설명
Go에서 버퍼링되지 않은 채널로 전송하면 다음이 발생할 때까지 전송자가 차단됩니다. 수신기를 사용할 수 있습니다. 제공된 코드에서 file1chan 채널로 단어를 보내는 역할을 하는 고루틴은 유일한 고루틴이며 수신자가 없습니다. 결과적으로 발신자가 무기한 차단되어 교착 상태가 발생합니다.
새 고루틴을 사용하는 해결 방법:
한 가지 해결 방법은 전송을 처리하기 위해 별도의 고루틴을 만드는 것입니다. 단어. 이 고루틴은 기본 고루틴을 차단하지 않으며 동시 실행을 허용합니다.
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) go func() { // start a new goroutine that sends strings down file1chan for scanner.Scan() { line := scanner.Text() // Split the line on a space parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan) // read strings from file1chan }
버퍼 채널을 사용하는 솔루션:
또 다른 솔루션은 버퍼 채널을 생성하는 것입니다. 이를 통해 여러 값을 동시에 보내고 받을 수 있습니다. 주어진 문제에 대해서는 버퍼 크기 1이면 충분합니다.
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string, 1) // buffer size of one for scanner.Scan() { line := scanner.Text() // Split the line on a space parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) // we're done sending to this channel now, so we close it. print(file1chan) }
위 내용은 Go에서 \'모든 고루틴이 잠자기 상태 - 교착 상태\' 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!