ホームページ >バックエンド開発 >Golang >チャネルとの同時実行 Go ルーチンを効果的に制限するにはどうすればよいですか?

チャネルとの同時実行 Go ルーチンを効果的に制限するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 08:45:291076ブラウズ

How to Effectively Limit Concurrent Go Routines with Channels?

同時 Go ルーチン数の制限

非同期で処理する必要がある URL のリストを操作する場合、多くの場合、同時実行 Go ルーチンの数を制限することが望ましいです。リソースの過大化を防ぎます。解決策には、同時に実行できるゴルーチンの最大数を制御する制限付きチャネルを作成することが含まれます。

元の試行

元の試行では、並列サイズのバッファリングされたチャネルが作成されました。

<code class="go">results := make(chan string, *parallel)</code>

その目的は、結果チャネルがいっぱいになったときに、チャネルから値が読み取られるまでプログラムをブロックし、別の goroutine を生成できるようにすることでした。ただし、このアプローチでは、すべての URL が処理されたときにメイン プログラムがブロックされないため、ゴルーチンの数が効果的に制限されません。

解決策

より効果的な解決策には、修正プログラムを作成することが含まれます。ワーカーゴルーチンの数:

<code class="go">for i := 0; i < *parallel; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()
        for url := range urls {
            worker(url, client, results)
        }
    }()
}</code>

このソリューションでは、ゴルーチンはチャネルから URL を取得して処理する役割を果たします。チャネルにはフィーダ ゴルーチンから URL が供給され、すべての URL が取得されると、フィーダ ゴルーチンはチャネルを閉じ、ワーカーにタスクを終了するよう通知します。

別のゴルーチンがワーカーの完了ステータスを監視します。 goroutines、すべてのワーカーが完了したら結果チャネルを閉じます。このアプローチは、実行中のゴルーチンの数を指定された並列数に効果的に制限します。

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

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