WaitGroup으로 고루틴 완료 후 채널 닫기
채널 및 고루틴으로 작업할 때 모든 고루틴이 완료된 후 채널을 닫는 것이 필수적입니다. 이렇게 하면 채널에서 추가 통신이 방지되고 리소스 관리가 원활해집니다.
제공된 코드는 이 동작을 구현하려고 시도하지만 경쟁 조건으로 인해 제한에 직면합니다. 이러한 문제를 해결하기 위해 sync.WaitGroup 유형을 활용할 수 있습니다.
WaitGroup을 사용하면 작업 모음을 생성하고 실행을 계속하기 전에 작업이 완료될 때까지 기다릴 수 있습니다. 채널을 닫는 상황에서 WaitGroup을 사용하면 모든 고루틴의 사용이 완료된 경우에만 채널이 닫히도록 할 수 있습니다.
WaitGroup을 사용하여 개선된 코드 조각:
import ( "sync" ) // ... var wg sync.WaitGroup for i := 0; i <= 10; i++ { wg.Add(1) go func() { result := calculate() c <- result wg.Done() }() } // Close the channel when all goroutines are finished go func() { wg.Wait() close(c) }() for result := range c { all_result = append(all_result, result...) }
이 업데이트된 코드에서는 WaitGroup을 사용하여 뛰어난 고루틴 수를 추적합니다. 작업을 실행하는 각 고루틴은 WaitGroup 카운터를 증가시켜 시작되었음을 나타냅니다. 완료되면 각 고루틴은 WaitGroup 카운터를 감소시켜 완료되었음을 나타냅니다. 별도의 고루틴은 WaitGroup을 기다리고 모든 고루틴이 완료를 보고하면 채널을 닫습니다.
이 접근 방식은 동기화되고 안정적인 채널 닫기를 보장하여 원본 코드에서 발생하는 문제를 방지합니다. 또한 잠자기 통화 및 바쁜 대기가 필요하지 않아 보다 효율적이고 강력한 솔루션을 제공합니다.
위 내용은 WaitGroup을 사용하여 모든 고루틴이 완료된 후 어떻게 채널을 안전하게 닫을 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!