>  기사  >  백엔드 개발  >  Go `select` 문이 `default` 케이스 없이 중단되는 이유는 무엇이며 어떻게 해결할 수 있나요?

Go `select` 문이 `default` 케이스 없이 중단되는 이유는 무엇이며 어떻게 해결할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-11-24 06:31:15291검색

Why Does a Go `select` Statement Hang Without a `default` Case and How Can It Be Fixed?

Select가 있는 Goroutine은 fmt.Print() 없이는 멈추지 않습니다.

문제:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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