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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 05:25:02779ブラウズ

How to Effectively Limit Concurrent Go Routines?

同時 Go ルーチンの制限

コード内で、同時 Go ルーチンの数を制限しようとします。ただし、現在の実装は意図したとおりに機能しません。別のアプローチは次のとおりです。

解決策:

URL ごとに goroutine を作成する代わりに、共有チャネルから URL を処理する固定数のワーカーを作成します。変更されたコードは次のとおりです:

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

// Workers get URLs from this channel
urls := make(chan string) 

// Feed the workers with URLs
go func() {
    for _, u := range flag.Args() {
        urls <- u
    }
    // Workers will exit from range loop when channel is closed
    close(urls)
}()

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

results := make(chan string)

// Start the specified number of workers.
for i := 0; i < *parallel; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()
        for url := range urls {
            worker(url, client, results)
        }
    }()
}

// When workers are done, close results so that main will exit.
go func() {
    wg.Wait()
    close(results)
}()

for res := range results {
    fmt.Println(res)
}</code>

説明:

  • バッファリングされたチャネル URL が作成され、URL がワーカーにフィードされます。
  • 別の goroutine は、指定された URL を URL チャネルに供給する役割を果たします。
  • 必要な数のワーカーが作成されます。各ワーカーは URL チャネルから URL を取得し、それらを順番に処理します。
  • すべてのワーカーが処理を終了すると、ゴルーチンは結果チャネルを閉じて、すべての結果が取得されたことを通知します。

これこのアプローチでは、常に最大数の並列ゴルーチンがアクティブになり、必要に応じて同時実行性が制限されます。

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

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