동시 프로그래밍에서는 동시에 실행되는 고루틴 수를 제어하는 것이 중요합니다. 한 가지 접근 방식은 버퍼링된 채널을 세마포어로 사용하는 것입니다. 그러나 세마포어가 완전히 소모될 때까지 기다릴 때 일반적인 문제가 발생합니다.
동시에 처리하려는 정수 조각이 있고 동시에 두 개로 제한된다고 가정해 보겠습니다. 일상생활을 하세요. 우리는 이 제한을 적용하기 위해 버퍼링된 채널을 세마포어로 사용합니다. 코드는 대부분의 정수에 대해 작동하지만 버퍼가 비어 있지 않기 때문에 마지막 go 루틴이 끝나기 전에 프로그램이 조기에 종료됩니다.
버퍼 채널이 비어 있을 때까지 어떻게 기다리나요? 완전히 배수하여 프로그램이 종료되기 전에 모든 go 루틴이 완료되도록 하시겠습니까?
채널 사용 특정 조건을 기다리는 것은 해당 조건의 길이를 확인할 수 있는 경쟁 없는 방법이 없기 때문에 가능하지 않습니다. 대신, 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을 사용하면 이전에 모든 고루틴이 완료될 때까지 기다릴 수 있습니다. 모든 처리가 완료되었는지 확인하면서 프로그램이 종료됩니다.
위 내용은 버퍼링된 채널을 세마포어로 사용할 때 모든 고루틴이 완료되었는지 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!