Go 루틴 완료를 기다리는 중
Go에서 일반적인 관행은 고루틴을 사용하여 동시 작업을 수행하는 것입니다. 기본 프로그램이 종료하기 전에 모든 고루틴이 완료될 때까지 기다리도록 하려면 적절한 동기화 메커니즘을 구현하는 것이 중요합니다.
질문에서 언급한 것처럼 한 가지 접근 방식은 부울 채널(완료)을 사용하는 것입니다.
func do_stuff(done chan bool) { fmt.Println("Doing stuff") done <- true }
func main() { fmt.Println("Main") done := make(chan bool) go do_stuff(done) <-done }
왜 <-완료 작동:
<-done 작업은 차단 채널 수신입니다. 완료 채널에서 값이 전송될 때까지 기다립니다. 제공된 코드에서 do_stuff는 작업 완료 시 채널에 true를 전송하여 메인의 <-done 작업이 성공하도록 합니다.
마지막 줄 주석 해제로 인한 교착 상태:
main에서 마지막 줄의 주석 처리를 제거하면 교착 상태가 발생합니다.
func main() { fmt.Println("Main") done := make(chan bool) go do_stuff(done) <-done // <-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() }() } // will wait until wg.Done is called 10 times (10 goroutines finish) wg.Wait() } func longOp() { time.Sleep(time.Second * 2) fmt.Println("long op done") }
sync.WaitGroup을 사용하면 메인이 프로그램을 종료하기 전에 10개의 고루틴이 모두 완료될 때까지 기다리게 됩니다.
위 내용은 메인 출구 전에 Go 루틴이 완료되었는지 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!