Go의 성능을 실험할 때 대량의 HTTP 요청을 동시에 실행하려고 시도하는 동안 제한 사항에 직면할 수 있습니다. . 이 기사에서는 직면한 과제를 탐색하고 최대 동시성을 달성하기 위한 솔루션을 제공합니다.
초기 접근 방식에는 HTTP 요청을 병렬로 보내기 위해 많은 수의 고루틴을 실행하는 것이 포함됩니다. 사용 가능한 모든 CPU. 그러나 파일 설명자 제한으로 인해 오류가 발생합니다.
이러한 제한을 극복하려면 다음 접근 방식을 고려하십시오.
다음은 이러한 최적화를 통합하는 수정된 코드 버전입니다.
package main import ( "fmt" "net/http" "runtime" "sync" "time" ) var ( reqs int concurrent int work chan *http.Request results chan *http.Response ) func init() { reqs = 1000000 concurrent = 200 } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) work = make(chan *http.Request, concurrent) results = make(chan *http.Response) start := time.Now() // Create a semaphore channel to limit concurrency sem := make(chan struct{}, concurrent) // Create a dispatcher to populate the work channel go func() { for i := 0; i < reqs; i++ { req, _ := http.NewRequest("GET", "http://localhost/", nil) work <- req } close(work) // Signal to workers that no more requests are incoming }() // Create a worker pool to process requests for i := 0; i < concurrent; i++ { go func() { for req := range work { resp, err := http.DefaultClient.Do(req) if err != nil { fmt.Println(err) } results <- resp // Release semaphore token to allow another worker to proceed <-sem } }() } // Consume responses from worker pool var ( conns int64 totalSize int64 wg sync.WaitGroup ) wg.Add(1) go func() { defer wg.Done() for { select { case resp, ok := <-results: if ok { conns++ totalSize += resp.ContentLength resp.Body.Close() } else { return } } } }() // Block until all responses are processed wg.Wait() elapsed := time.Since(start) fmt.Printf("Connections:\t%d\nConcurrent:\t%d\nTotal size:\t%d bytes\nElapsed:\t%s\n", conns, concurrent, totalSize, elapsed) }
동시 변수를 조정하고 결과를 관찰하면 시스템에 대한 최적의 동시성 수준을 결정하여 시스템 용량을 "최대화"할 수 있습니다. 동시 HTTP 요청.
위 내용은 Go에서 동시 HTTP 요청을 최대화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!