여러 고루틴을 동시에 관리할 때 활성 고루틴 수를 모니터링해야 하는 경우가 많습니다. Go에서는 기본 런타임.NumGoroutine() 함수가 이 정보를 제공합니다.
다음 예를 고려하세요.
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 has len", len(queue)) //this must be 0 }
이 코드는 고루틴 사용을 보여주지만 방법을 제공하지는 않습니다. 주어진 시간에 활성 고루틴 수를 계산합니다.
이 문제를 해결하기 위해 보다 효율적인 접근 방식은 여러 고루틴의 완료를 조정하는 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 has len", len(queue)) //this must be 0 }
이 수정된 코드에서 sync.WaitGroup은 활성 고루틴의 수를 추적하는 데 사용됩니다. 각 고루틴은 완료 시 카운터를 감소시키며, 기본 고루틴은 진행하기 전에 모든 고루틴의 실행이 완료될 때까지 기다립니다.
runtime.NumGoroutine() 또는 더 효율적인 sync.WaitGroup을 활용하여 Go 프로그래머는 효과적으로 모니터링하고 관리할 수 있습니다. 애플리케이션의 활성 고루틴.
위 내용은 Go에서 활성 고루틴을 효율적으로 계산하고 관리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!