> 백엔드 개발 > Golang > Go에서 활성 고루틴을 정확하게 계산하고 관리하는 방법은 무엇입니까?

Go에서 활성 고루틴을 정확하게 계산하고 관리하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-11-28 18:21:11
원래의
998명이 탐색했습니다.

How to Accurately Count and Manage Active Goroutines in Go?

활성 고루틴 수를 계산하고 표시하는 방법

이 코드에는 대기열 제거와 대기열 추가를 모두 수행하는 대기열과 함수 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 사용

runtime.NumGoroutine을 사용하여 활성 고루틴의 총 개수를 가져오는 방법이 있지만 이것이 최선의 방법은 아닙니다. 이는 루프가 계속해서 고루틴을 생성하여 불필요한 CPU 소비를 초래하기 때문입니다.

더 나은 접근 방식: Sync.WaitGroup 사용

더 효율적인 접근 방식은 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(&amp;wg, queue)
    }
    wg.Wait()
    close(queue)
    fmt.Println("list len", len(queue)) //this must be 0
}
로그인 후 복사

여기서는 4개로 시작합니다. 고루틴을 실행하고 대기열을 닫기 전에 작업이 완료될 때까지 기다립니다. 이 접근 방식은 활성 고루틴 수를 관리하는 보다 명확하고 제어된 방법을 제공합니다.

위 내용은 Go에서 활성 고루틴을 정확하게 계산하고 관리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿