Go 루틴을 적절하게 기다려서 정상적인 프로그램 종료 보장
Go 루틴을 사용할 때는 프로그램을 종료하기 전에 완료되었는지 확인하는 것이 중요합니다. . 루틴이 끝날 때까지 기다리는 메커니즘을 이해하면 효과적으로 구현할 수 있습니다.
"<-done" 메커니즘 공개
기다림의 핵심 Go 루틴은 차단 작업인 "<- done" 문을 사용하고 있습니다. 이는 값이 채널로 전송될 때까지 프로그램이 일시 중지됨을 의미합니다. 제공한 예에서 "done" 채널은 "do_stuff" 루틴의 완료를 알리는 데 사용됩니다. "done <- true"가 실행되면 "<- done" 문이 차단 해제되어 프로그램을 계속할 수 있습니다.
적절한 동기화를 통해 교착 상태 방지
마지막 줄의 주석 처리를 해제하면 "done" 채널을 이미 한 번 읽었기 때문에 교착 상태가 발생합니다. 교착 상태는 둘 이상의 루틴이 서로 보유하는 리소스를 획득하려고 시도하여 진행을 방해하는 종속성을 생성할 때 발생합니다. 이를 방지하려면 루틴과 채널 간의 적절한 동기화를 확인하세요.
장기 실행 기능을 병렬화하려는 시나리오에서는 "동기화" 패키지가 더욱 강력한 솔루션을 제공합니다. "sync.WaitGroup" 유형을 사용하면 활성 루틴 수를 추적하고 진행하기 전에 완료될 때까지 기다릴 수 있습니다. 아래 예는 이 접근 방식을 보여줍니다.
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { longOp() wg.Done() }() } // Wait for all routines to finish wg.Wait() } func longOp() { time.Sleep(time.Second * 2) fmt.Println("Long operation completed") }
"sync.WaitGroup"을 사용하면 프로그램이 진행하기 전에 모든 장기 실행 기능이 완료될 때까지 기다리도록 하여 잠재적인 교착 상태를 방지할 수 있습니다. 이는 Go 루틴 조정에 대한 보다 통제된 접근 방식을 제공합니다.
위 내용은 모든 고루틴이 완료된 후 Go 프로그램을 어떻게 정상적으로 종료할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!