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

동시 Go 프로그램에서 활성 고루틴을 정확하게 계산하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-07 15:16:14
원래의
533명이 탐색했습니다.

How to Accurately Count Active Goroutines in a Concurrent Go Program?

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

프로그램에서 동시에 활성화된 고루틴 수를 모니터링하고 싶습니다. 대기열에서 빼기 및 대기열에 넣기. 대기열 관리를 위한 코드를 제공하면서 현재 활성 고루틴 수를 검색하는 방법에 대해 문의하셨습니다.

  • Runtime.NumGoroutine:
    runtime .NumGoroutine은 Go 프로그램에서 현재 활성 고루틴 수를 검색하는 방법을 제공합니다. 그러나 현재 구현에서 이 접근 방식을 사용하려고 하면 고루틴 생성자 루프가 계속해서 새로운 고루틴을 생성하기 때문에 잘못된 결과가 발생할 수 있습니다.
  • WaitGroup 사용:
    더 적합한 솔루션은 다음과 같습니다. sync.WaitGroup을 활용합니다. WaitGroup은 여러 고루틴의 대기 및 동기화를 허용합니다. WaitGroup을 초기화하고 이를 고루틴 함수에 전달합니다. 작업을 시작하는 각 고루틴은 wg.Add(1)을 호출해야 하며, 완료되면 wg.Done()을 호출하여 개수를 줄여야 합니다. 그런 다음 Main() 함수는 wg.Wait()를 호출하여 모든 고루틴이 완료될 때까지 기다릴 수 있습니다.

다음은 WaitGroup을 사용하여 수정된 코드 버전입니다.

import (
    "fmt"
    "sync"
)

var element int

func deen(wg *sync.WaitGroup, queue chan int) {
    for element := range queue {
        wg.Done() // Decrement the WaitGroup count upon completion
        fmt.Println("element is", element)
        if element%2 == 0 {
            fmt.Println("new element is", element)
            wg.Add(2) // Increment WaitGroup count for spawned goroutines
            queue <- (element*100 + 11)
            queue <- (element*100 + 33)
        }
    }
}

func main() {
    var wg sync.WaitGroup
    queue := make(chan int, 10)
    queue <- 1
    queue <- 2
    queue <- 3
    queue <- 0

    fmt.Println("initial active goroutines:", runtime.NumGoroutine())

    for i := 0; i < 4; i++ {
        wg.Add(1) // Increment WaitGroup count for each spawned goroutine
        go deen(&wg, queue)
    }

    wg.Wait() // Wait for all goroutines to complete
    close(queue)
    fmt.Println("final active goroutines:", runtime.NumGoroutine())
    fmt.Println("list length:", len(queue)) // Expect 0
}
로그인 후 복사

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

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