首頁 > 後端開發 > Golang > Go中如何有效率處理並發HTTP請求?

Go中如何有效率處理並發HTTP請求?

DDD
發布: 2024-12-13 08:44:12
原創
199 人瀏覽過

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板