ホームページ > バックエンド開発 > Golang > Go で同時実行ゴルーチンの数を一定に維持するにはどうすればよいですか?

Go で同時実行ゴルーチンの数を一定に維持するにはどうすればよいですか?

DDD
リリース: 2024-12-06 09:15:10
オリジナル
440 人が閲覧しました

How to Maintain a Fixed Number of Concurrent Goroutines in Go?

同時実行ゴルーチンの固定数の維持

Go では、同時実行ゴルーチンの数の制御が重要となるシナリオに遭遇することがあります。多くの場合、チュートリアルではゴルーチンが完了するのを待つことに重点が置かれていますが、常に特定の数のアクティブなゴルーチンを達成するには別の課題が生じます。

次の状況を考えてみましょう。処理するタスクが数十万件あるとします。各タスクの処理には独自の goroutine が必要ですが、システム リソースが同時に処理できる goroutine は最大 20 個までです。常に 20 個のゴルーチンが実行されていることを確認し、既存のゴルーチンが完了するたびに新しいゴルーチンを起動する必要があります。

制限付き並列処理

これを実現するには、Go 同時実行パターンを使用します。この記事では、「有界並列処理」と呼ばれるパターンの使用を提案しています。これには、同時ワーカーの数を制限するためのガードとして空の構造体のチャネルを使用することが含まれます。

実装

このパターンを実装する方法を示す例を次に示します。

package main

import (
    "fmt"
    "sync"
)

func main() {
    const maxGoroutines = 20

    // Create a channel of empty structs to control worker count
    guard := make(chan struct{}, maxGoroutines)

    var wg sync.WaitGroup

    // Launch workers
    for i := 0; i < 30; i++ {
        wg.Add(1)
        guard <- struct{}{} // Blocks if guard channel is filled
        go func(n int) {
            defer wg.Done()
            worker(n)
            <-guard // Release slot in guard channel
        }(i)
    }
    wg.Wait()
}

func worker(i int) { fmt.Println("doing work on", i) }
ログイン後にコピー

この例では、ガード チャネルがトークン バケットとして使用されます。同時に実行できるゴルーチンの最大数は、チャネルの容量によって制限されます (この場合は 20)。各ゴルーチンは、作業を開始する前にチャネルから「トークン」(空の構造体)を取得します。 goroutine が終了すると、そのトークンがチャネルに解放され、別の goroutine がそのトークンを取得できるようになります。チャネル内のトークンの数を制御することで、同時実行ゴルーチンの数を効果的に制御できます。

以上がGo で同時実行ゴルーチンの数を一定に維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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