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 サイトの他の関連記事を参照してください。