>  기사  >  백엔드 개발  >  모든 고루틴이 완료되었는데도 Go 프로그램이 중단되는 이유는 무엇입니까? sync.WaitGroup 및 채널 차단에 대한 가이드입니다.

모든 고루틴이 완료되었는데도 Go 프로그램이 중단되는 이유는 무엇입니까? sync.WaitGroup 및 채널 차단에 대한 가이드입니다.

Barbara Streisand
Barbara Streisand원래의
2024-10-25 11:54:02793검색

Why Does My Go Program Stall Even When All Goroutines Have Finished? A Guide to sync.WaitGroup and Channel Blocking.

Goroutine 종료에 대한 혼란: sync.WaitGroup 및 채널 차단의 미스터리 공개

Go에서는 sync.WaitGroup 및 채널을 사용하여 동시성을 관리하는 것이 일반적인 관행입니다. 그러나 초보자에게는 고루틴 완료 기대치를 충족했음에도 불구하고 프로그램이 중단되는 경우 당황스러울 수 있습니다. 구체적인 사례를 자세히 살펴보고 근본적인 문제를 풀어보겠습니다.

문제

개발자는 sync.WaitGroup과 채널(fetchedSymbols)을 활용하여 주가 목록을 동시에 검색하는 프로그램을 구현했습니다. 프로그램이 고루틴이 완료될 때까지 기다리는 동안 종료를 거부했습니다.

문제 이해

문제의 근본 원인은 fetchedSymbols 채널을 닫지 않는 데 있습니다. main 함수에서 이 채널을 반복하면 프로그램이 무기한 차단됩니다. 이 경우 모든 고루틴이 완료되면 채널 닫기가 시작되어야 합니다.

해결책

원활한 프로그램 실행을 보장하기 위해 개발자는 sync.WaitGroup을 모니터링하고 트리거하는 도우미 고루틴을 도입했습니다. 모든 고루틴이 작업을 마치면 fetchedSymbols를 닫습니다. 이를 통해 차단 동작이 제거되고 프로그램이 정상적으로 종료될 수 있습니다.

구현

<code class="go">go func() {
    wg.Wait()
    close(fetchedSymbols)
}()

for response := range fetchedSymbols {
    fmt.Println("fetched " + response)
}</code>

이 솔루션을 구현하면 이제 모든 주식 시세를 성공적으로 다운로드한 후 프로그램이 정상적으로 종료되어 Go의 동시성을 효율적으로 활용합니다. 기능.

위 내용은 모든 고루틴이 완료되었는데도 Go 프로그램이 중단되는 이유는 무엇입니까? sync.WaitGroup 및 채널 차단에 대한 가이드입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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