ホームページ > バックエンド開発 > Golang > Go で同時 HTTP リクエストを効率的に処理するにはどうすればよいですか?

Go で同時 HTTP リクエストを効率的に処理するにはどうすればよいですか?

DDD
リリース: 2024-12-13 08:44:12
オリジナル
129 人が閲覧しました

How to Efficiently Handle Concurrent HTTP Requests in Go?

Go で同時 HTTP リクエストを最大化する方法

Go で同時 HTTP リクエストを最大化するには、ファイル記述子の制限に対処する必要があります。これらの制限を超えると発生する一般的なエラーは次のとおりです。

net/http: Request.Body is closed
ログイン後にコピー

改良された同時実行アプローチ

ワーカー プールとセマフォ チャネルを使用した、より効果的な同時実装を次に示します。

import (
    "fmt"
    "log"
    "net/http"
    "runtime"
    "sync"
    "time"
)

// Default values
var (
    reqs        = 1000000
    maxWorkers  = 200
    sem         = make(chan bool, maxWorkers)
    respChan    = make(chan *http.Response)
    respErrChan = make(chan error)
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())

    // Dispatcher: sends requests to the worker pool
    go func() {
        for i := 0; i < reqs; i++ {
            sem <- true
            req, err := http.NewRequest(http.MethodGet, "http://localhost:8080", nil)
            if err != nil {
                respErrChan <- err
                return
            }
            client := &http.Client{Timeout: 15 * time.Second}
            resp, err := client.Do(req)
            if err != nil {
                respErrChan <- err
                return
            }
            respChan <- resp
        }
        close(sem)
        close(respChan)
    }()

    // Worker Pool: sends requests to the API
    var wg sync.WaitGroup
    for i := 0; i < maxWorkers; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for {
                select {
                case resp := <-respChan:
                    fmt.Println(resp.Status)
                    resp.Body.Close()
                    sem <- true
                case err := <-respErrChan:
                    log.Fatal(err)
                }
            }
        }()
    }

    wg.Wait()
}
ログイン後にコピー

このアプローチでは、ワーカー プールを使用して、限られた時間内でリクエストを同時に送信します。セマフォを使用して、同時リクエストの数をシステム制限内に保ちます。ステータスの出力やボディのクローズなど、応答処理も改善されています。この手法は、元の実装と比較して、より正確でスケーラブルです。

以上がGo で同時 HTTP リクエストを効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート