ホームページ  >  記事  >  バックエンド開発  >  Go での Goroutine の同時実行を制限するにはどうすればよいですか?

Go での Goroutine の同時実行を制限するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-02 05:27:02964ブラウズ

How to Limit Concurrent Goroutine Execution in Go?

Goroutine の同時実行の制限

処理する URL のリストがあり、同時に実行される Goroutine の数を制限したいシナリオを考えてみましょう。 。たとえば、URL が 30 個ある場合、並行して動作するゴルーチンは 10 個のみとします。

提供されたコードは、サイズ Parallel のバッファリングされたチャネルを使用して、実行中のゴルーチンの数を制限しようとします。 。ただし、このアプローチでは、すべての URL を処理した後でもブロックされないようです。この同時実行制限を達成するより効果的な方法は、指定した数のワーカー ゴルーチンを作成し、専用チャネルを通じて URL をフィードすることです。

コードの改良版は次のとおりです。

<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed")
flag.Parse()
urls := flag.Args()

// Create a channel to hold URLs that workers will consume
workerURLChan := make(chan string)

// Start a goroutine to feed URLs to the workers
go func() {
    for _, u := range flag.Args() {
        workerURLChan <- u
    }

    // Once all URLs have been distributed, close the channel, which will cause workers to exit
    close(workerURLChan)
}()

var wg sync.WaitGroup
client := rest.Client{}

results := make(chan string)

// Start the specified number of worker goroutines
for i := 0; i < *parallel; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()

        // Workers repeatedly fetch URLs from the channel until it is closed
        for url := range workerURLChan {
            worker(url, client, results)
        }
    }()
}

// Close the results channel when all workers have completed, which will allow the main goroutine to exit
go func() {
    wg.Wait()
    close(results)
}()

// Receive and print results from the worker goroutines
for res := range results {
    fmt.Println(res)
}</code>

この更新されたコードでは、許可された同時実行ごとにワーカー goroutine を作成し、これらのワーカーは専用チャネルから URL をフェッチします。すべての URL が配布されると、workerURLChan が閉じられ、現在の URL が完了するとワーカーが終了します。このメカニズムは、同時に実行される goroutine の数を効果的に制限します。

以上がGo での Goroutine の同時実行を制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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