ホームページ > バックエンド開発 > Golang > 同時実行 Go プログラムでアクティブな Goroutine を正確にカウントするにはどうすればよいですか?

同時実行 Go プログラムでアクティブな Goroutine を正確にカウントするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-07 15:16:14
オリジナル
533 人が閲覧しました

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

アクティブな goroutine の数をカウントして表示する方法

プログラム内で、現在アクティブな goroutine の数を同時に監視したいとします。キューのデキューとエンキュー。キューを管理するコードを提供しましたが、アクティブな goroutine の現在の数を取得するメソッドについて問い合わせました。

  • Runtime.NumGoroutine:
    ランタイム.NumGoroutine は、Go プログラム内のアクティブな goroutine の現在の数を取得する方法を提供します。ただし、現在の実装でこのアプローチを採用しようとすると、ゴルーチンのスポナー ループが新しいゴルーチンを継続的に作成するため、不正確な結果が生じる可能性があります。
  • WaitGroup の使用:
    より適切な解決策には、次のようなものがあります。 sync.WaitGroup を利用します。 WaitGroup を使用すると、複数のゴルーチンの待機と同期が可能になります。 WaitGroup を初期化し、それを goroutine 関数に渡します。作業を開始する各ゴルーチンは 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 プログラムでアクティブな Goroutine を正確にカウントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート