이 코드에는 대기열 제거와 대기열 추가를 모두 수행하는 대기열과 함수 deen이 있습니다.
var element int func deen(queue chan int) { element := <-queue fmt.Println("element is ", element) if element%2 == 0 { fmt.Println("new element is ", element) queue <- (element*100 + 11) queue <- (element*100 + 33) } } func main() { queue := make(chan int, 10) queue <- 1 queue <- 2 queue <- 3 queue <- 0 for len(queue) != 0 { for i := 0; i < 2; i++ { go deen(queue) } } fmt.Scanln() fmt.Println("list is has len", len(queue)) //this must be 0 }
단, 현재 활성 인원수를 출력할 수 있는 방법은 없습니다.
runtime.NumGoroutine을 사용하여 활성 고루틴의 총 개수를 가져오는 방법이 있지만 이것이 최선의 방법은 아닙니다. 이는 루프가 계속해서 고루틴을 생성하여 불필요한 CPU 소비를 초래하기 때문입니다.
더 효율적인 접근 방식은 sync.WaitGroup을 사용하는 것입니다. 활성 고루틴의 수를 추적해 보겠습니다.
func deen(wg *sync.WaitGroup, queue chan int) { for element := range queue { fmt.Println("element is ", element) if element%2 == 0 { fmt.Println("new element is ", element) wg.Add(2) queue <- (element*100 + 11) queue <- (element*100 + 33) } wg.Done() } } func main() { var wg sync.WaitGroup queue := make(chan int, 10) queue <- 1 queue <- 2 queue <- 3 queue <- 0 for i := 0; i < 4; i++ { wg.Add(1) go deen(&wg, queue) } wg.Wait() close(queue) fmt.Println("list len", len(queue)) //this must be 0 }
여기서는 4개로 시작합니다. 고루틴을 실행하고 대기열을 닫기 전에 작업이 완료될 때까지 기다립니다. 이 접근 방식은 활성 고루틴 수를 관리하는 보다 명확하고 제어된 방법을 제공합니다.
위 내용은 Go에서 활성 고루틴을 정확하게 계산하고 관리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!