ホームページ >よくある問題 >Go言語でリクエスト数を制限する方法

Go言語でリクエスト数を制限する方法

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌オリジナル
2023-06-09 13:13:101235ブラウズ

Go 言語でリクエスト数を制限する方法は次のとおりです: 1. Go サンプル ファイルを作成します; 2. 必要なパッケージをインポートし、同時リクエストの最大数「同時実行数」を設定します; 3. sem チャネルを介した同時実行の最大数。アイドル状態のチャネルが使用可能になるまで、他のリクエストをブロックします。構文は「sem := make(chan struct{}, concurrency)」です。

Go言語でリクエスト数を制限する方法

このチュートリアルのオペレーティング システム: 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 サイトの他の関連記事を参照してください。

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