>  기사  >  백엔드 개발  >  WaitGroups 및 채널을 사용할 때 Go 애플리케이션이 중단되는 이유는 무엇입니까?

WaitGroups 및 채널을 사용할 때 Go 애플리케이션이 중단되는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-26 08:19:02697검색

Why Do Go Applications Hang When Using WaitGroups and Channels?

WaitGroups를 사용하여 Go 애플리케이션에서 Clean Exit 채널 닫기

이 문서에서는 Go에서 sync.WaitGroup 및 채널을 사용할 때 직면하는 일반적인 문제를 조사합니다. 모든 고루틴이 작업을 완료한 후 주요 기능이 종료되는 것을 방지할 수 있는 프로그램입니다. 문제와 해결책을 살펴보겠습니다.

문제: 무한 대기

제공된 예에서 기본 함수는 sync.WaitGroup 및 채널(fetchedSymbols)을 활용합니다. 주식 시세를 가져오고 저장하는 동시 고루틴을 관리합니다. 고루틴이 작업을 완료하는 동안 프로그램은 종료되지 않고 무기한 정지됩니다.

문제: Non-Closed Channel

주인은 주 함수의 범위 루프입니다. . fetchedSymbols 채널을 반복하면 채널이 닫히지 않으므로 진행이 차단됩니다. 결과적으로 모든 값이 이미 수신되었음에도 불구하고 기본 함수는 채널을 통해 새 값이 전송될 때까지 무기한 기다립니다.

해결책: 채널 닫기

이 문제를 해결하려면 모든 고루틴이 작업을 완료한 후 fetchedSymbols 채널을 닫는 것이 중요합니다. 이는 더 이상 수신할 값이 없다는 신호를 범위 루프에 보내 반복을 종료하고 기본 기능을 진행할 수 있도록 합니다.

한 가지 접근 방식은 sync.WaitGroup의 Wait 메서드를 사용하여 값이 모두 모였을 때 신호를 보내는 것입니다. 고루틴이 끝났습니다. WaitGroup이 0에 도달할 때까지 기다린 다음 채널을 닫는 고루틴을 시작할 수 있습니다.

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

이 수정을 사용하면 기본 기능의 범위 루프가 결국 채널 끝에 도달하여 프로그램을 사용하여 "완료" 메시지를 인쇄하고 정상적으로 종료할 수 있습니다.

sync.WaitGroup으로 작업할 때 채널을 닫는 것의 중요성을 이해함으로써 Go 개발자는 동시 작업 실행 후 애플리케이션이 예상대로 종료되도록 할 수 있습니다.

위 내용은 WaitGroups 및 채널을 사용할 때 Go 애플리케이션이 중단되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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