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