Go 中並發HTTP 請求的有效最大化
在您的程式碼中,您嘗試並發100 萬個HTTP 請求,但遇到了錯誤文件描述符限制。以下是如何在系統限制內用請求有效地「淹沒」您的筆記型電腦:
使用基於通道的並發修改代碼:
<br>package main <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")
func init() {
)func init() {*http.Response err error
)
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 }
類型回應結構{
t := &http.Transport{} for i := 0; i < max; i++ { go worker(t, reqChan, respChan, wg) }
}
}for req := range reqChan { resp, err := t.RoundTrip(req) r := Response{resp, err} respChan <- r } wg.Done()
}
}}
}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
}
}}
}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)
func workerPool(reqChan chan
http.Request,respChan chan 回應,wg
http}
func main() {
}以上是Go中如何有效率最大化並發HTTP請求,同時避免系統資源耗盡?的詳細內容。更多資訊請關注PHP中文網其他相關文章!