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 중국어 웹사이트의 기타 관련 기사를 참조하세요!