Go 言語でリクエスト数を制限する方法は次のとおりです: 1. Go サンプル ファイルを作成します; 2. 必要なパッケージをインポートし、同時リクエストの最大数「同時実行数」を設定します; 3. sem チャネルを介した同時実行の最大数。アイドル状態のチャネルが使用可能になるまで、他のリクエストをブロックします。構文は「sem := make(chan struct{}, concurrency)」です。
このチュートリアルのオペレーティング システム: Windows 10 システム、Go1.20.1 バージョン、Dell G3 コンピューター。
Go 言語では、channel チャネルと呼ばれるデータ型が提供されます。このチャネルを使用してリクエストの数を制御できます。
次に、キャッシュのあるチャネルを使用し、リクエストの最大数を容量として設定し、空きチャネル容量ができるまでリクエストが送信されるたびにブロックしてからリクエストを続行するサンプル コードを示します。
package main import ( "fmt" "net/http" ) func main() { urls := []string{ "https://www.google.com", "https://www.facebook.com", "https://www.airbnb.com", "https://www.github.com", "https://www.twitter.com", "https://www.linkedin.com", "https://www.youtube.com", "https://www.microsoft.com", "https://www.reddit.com", "https://www.stackoverflow.com", } concurrency := 3 // 最大同时请求数量 sem := make(chan struct{}, concurrency) for _, url := range urls { sem <- struct{}{} go func(url string) { request(url) <-sem }(url) } for i := 0; i < concurrency; i++ { sem <- struct{}{} } } func request(url string) { res, err := http.Get(url) if err != nil { fmt.Printf("%s is down\n", url) return } defer res.Body.Close() fmt.Printf("%s -> status code: %d \n", url, res.StatusCode) }
上の例では、10 の HTTP リクエストを開始しましたが、sem チャネルで同時実行の最大数を設定したため、同時に発生したリクエストは 3 つだけでした。こうすることで、同時実行制限に達すると、空きチャネルが利用可能になるまで、他のすべてのリクエストがブロックされます (sem <- struct {}{})。
以上がGo言語でリクエスト数を制限する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。