버퍼 채널이 드레이닝되기를 기다리는 중
제공된 코드에서는 버퍼 채널을 세마포어로 사용하여 동시 채널 수를 제한합니다. 고루틴을 실행 중입니다. 그러나 채널이 배수될 때까지 기다리는 명시적인 메커니즘이 없으면 모든 고루틴 실행이 완료되기 전에 기본 프로그램이 종료될 수 있습니다.
문제:
이를 보장하는 방법 프로그램은 모든 고루틴이 완료될 때까지 기다립니다. 종료하시겠습니까?
답변:
이 목적으로 세마포어(채널)를 사용하는 것은 채널의 길이를 확인하고 기다리는 방법이 내장되어 있지 않기 때문에 이상적이지 않습니다. 0에 도달합니다. 고루틴이 완료될 때까지 제대로 기다리려면 다음과 같은 동기화 프리미티브를 사용하는 것을 고려하세요. sync.WaitGroup.
업데이트된 코드:
sem := make(chan struct{}, 2) var wg sync.WaitGroup for _, i := range ints { wg.Add(1) // acquire semaphore sem <- struct{}{} // start long running go routine go func(id int) { defer wg.Done() // do something // release semaphore <-sem }(i) } wg.Wait()
sync.WaitGroup은 미해결 작업 수를 유지합니다(이 경우 고루틴). . 이렇게 하면 기본 프로그램이 모든 작업이 완료될 때까지 기다릴 수 있습니다. wg.Add(1)는 새 고루틴을 시작하기 전에 작업 수를 증가시키고, wg.Done()은 고루틴이 완료되면 작업 수를 감소시킵니다. wg.Wait() 호출은 작업 수가 0에 도달할 때까지 기본 프로그램을 차단하여 프로그램이 종료되기 전에 모든 고루틴이 완료되도록 합니다.
위 내용은 버퍼링된 채널을 세마포로 사용할 때 프로그램 종료 전에 모든 고루틴이 완료되었는지 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!