문제:
Go Tour 연습에서 #71, go run 71_hang.go nogood을 사용하면 프로그램이 무한정 실행되는 반면 go run 71_hang.go ok 예상대로 작동합니다. 유일한 차이점은 select 문의 기본 사례에 fmt.Print("")를 추가한다는 것입니다.
설명:
select의 기본 문이 변경됩니다. 진술의 행동. 기본값이 없으면 채널에 메시지가 나타날 때까지 차단을 선택합니다. 기본적으로 Select는 채널에서 읽을 내용이 없을 때마다 기본 문을 실행합니다.
원본 코드에서 기본 문은 무한 루프를 생성합니다. 스케줄러는 다른 고루틴을 예약할 수 없으므로 프로그램은 무기한 실행됩니다.
해결책 1:
기본 문을 제거하고 비차단 선택을 사용하세요.
for { select { case todo := <-toDoList: if todo.depth > 0 && !visited[todo.url] { crawling++ visited[todo.url] = true go crawl(todo, fetcher, toDoList, doneCrawling) } case <-doneCrawling: crawling-- } if crawling == 0 { break } }
솔루션 2:
기본 문을 유지하되 고루틴이 결과를 내는지 확인하세요. 이를 달성하는 한 가지 방법은 스케줄러가 여러 코어를 사용할 수 있도록 하는 GOMAXPROCS=2를 사용하는 것입니다.
추가 참고:
고루틴은 협력적으로 예약됩니다. Select는 고루틴이 양보해야 하는 지점입니다. 그러나 주어진 예에서 fmt.Print() 문 없이 select가 생성되지 않는 이유는 완전히 이해되지 않았으며 추가 조사가 필요합니다.
위 내용은 Go `select` 문이 `default` 케이스 없이 중단되는 이유는 무엇이며 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!