Go에서 동시 HTTP 요청의 효과적인 최대화
코드에서 1백만 개의 HTTP 요청을 동시에 전송하려고 시도했지만 오류가 발생했습니다. 파일 설명자 제한 사항. 시스템 제약 내에서 노트북에 요청이 효과적으로 '넘치는' 방법은 다음과 같습니다.
채널 기반 동시성을 사용하여 수정된 코드:
<br>package main </p> <p>가져오기 (</p> <pre class="brush:php;toolbar:false">"flag" "fmt" "log" "net/http" "runtime" "sync" "time"
)
var (
reqs int max int
)
func init() {
flag.IntVar(&reqs, "reqs", 1000000, "Total requests") flag.IntVar(&max, "concurrent", 200, "Maximum concurrent requests")
}
응답 구조체 유형 {
*http.Response err error
}
func 디스패처(reqChan chan *http.Request) {
defer close(reqChan) for i := 0; i < reqs; i++ { req, err := http.NewRequest("GET", "http://localhost/", nil) if err != nil { log.Println(err) } reqChan <- req }
}
func WorkerPool(reqChan chan http.Request, respChan chan 응답, wg sync.WaitGroup) {
t := &http.Transport{} for i := 0; i < max; i++ { go worker(t, reqChan, respChan, wg) }
}
func 작업자(t http.Transport, reqChan chan http.Request, respChan chan Response, wg * sync.WaitGroup) {
for req := range reqChan { resp, err := t.RoundTrip(req) r := Response{resp, err} respChan <- r } wg.Done()
}
func 소비자(respChan chan 응답) (int64, int64) {
var ( conns int64 size int64 ) for conns < int64(reqs) { select { case r, ok := <-respChan: if ok { if r.err != nil { log.Println(r.err) } else { size += r.ContentLength if err := r.Body.Close(); err != nil { log.Println(r.err) } } conns++ } } } return conns, size
}
func main() {
flag.Parse() runtime.GOMAXPROCS(runtime.NumCPU()) reqChan := make(chan *http.Request, max) respChan := make(chan Response) wg := sync.WaitGroup{} wg.Add(max) start := time.Now() go dispatcher(reqChan) go workerPool(reqChan, respChan, &wg) conns, size := consumer(respChan) wg.Wait() took := time.Since(start) ns := took.Nanoseconds() av := ns / conns average, err := time.ParseDuration(fmt.Sprintf("%d", av) + "ns") if err != nil { log.Println(err) } fmt.Printf("Connections:\t%d\nConcurrent:\t%d\nTotal size:\t%d bytes\nTotal time:\t%s\nAverage time:\t%s\n", conns, max, size, took, average)
}
설명:
수정의 이점:
이러한 수정 사항을 따르면 시스템 리소스 제한 내에서 최대한 많은 HTTP 요청으로 노트북을 효과적으로 '넘치게' 할 수 있습니다.
위 내용은 시스템 리소스 고갈을 피하면서 Go에서 동시 HTTP 요청을 효율적으로 최대화하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!