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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-02 00:49:14912ブラウズ

How to Maintain a Constant Number of Simultaneously Running Goroutines in Go?

Go でのゴルーチンのスレッド化: 定数を同時に実行する

Go の同時実行の領域では、指定された数のゴルーチンの完了を待つための大量の資料が提供されます。ただし、明確な課題が存在します。それは、事前に定義された数のゴルーチンを継続的に実行し、1 つのゴルーチンが開始され、別のゴルーチンが終了することを保証することです。

MySQL から取得したデータの処理など、大量のタスクを含むシナリオを考えてみましょう。データベース。単純なアプローチでは、膨大な数の並列ゴルーチンが開始され、数十万のタスクが同時に実行される可能性があります。対照的に、望ましい動作では、同時に実行するゴルーチンを固定数 (たとえば 20) に制限します。

この制御された同時実行パターンは、「制限された並列処理」として知られています。 Go でこのパターンを実装するには、空の構造体のチャネルをセマフォとして使用する必要があり、同時ワーカー ゴルーチンの最大数を決定します。以下に図を示します。

package main

import "fmt"

func main() {
    maxGoroutines := 10
    guard := make(chan struct{}, maxGoroutines)

    for i := 0; i < 30; i++ {
        guard <- struct{}{} // blocks if guard channel is full
        go func(n int) {
            worker(n)
            <-guard // unlocks a slot in guard
        }(i)
    }
}

func worker(i int) { fmt.Println("doing work on", i) }

この実装では、指定された数を超えるゴルーチンが同時に実行されないようにします。その結果、ワーカー goroutine が終了すると、新しい goroutine がすぐに起動され、必要な同時実行レベルが維持されます。

「Go 同時実行パターン」の記事では、「制限された並列処理」セクションでこの概念をさらに詳しく説明し、より詳細な情報を提供します。この重要な同時実行技術についての洞察。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。