Golang의 웹 서버가 동시 요청을 처리하지 않는 이유는 무엇입니까?
이 간단한 HTTP 서버에는 각 요청에 5 초가 걸리는 time.Sleep () 호출이 포함되어 있습니다. 브라우저에서 여러 탭을 빠르게로드하려고하면 각 요청이 대기열에 있고 순차적으로 처리된다는 것이 분명합니다. 동시 요청을 처리하려면 어떻게해야합니까?
package main
import (
"fmt"
"net/http"
"time"
)
func serve(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, world.")
time.Sleep(5 * time.Second)
}
func main() {
http.HandleFunc("/", serve)
http.ListenAndServe(":1234", nil)
}
사실 저는 질문을 작성하고 나서 이것에 대한 답을 찾았는데 매우 미묘합니다. Google에서 답을 찾을 수 없었기 때문에 어쨌든 게시하고 있습니다. 내가 뭘 잘못하고 있는지 볼 수 있습니까?
프로그램은 이미 요청을 동시에 처리합니다. ab
Apache 2와 함께 제공되는 벤치 마크 도구 인으로 테스트 할 수 있습니다 .
ab -c 500 -n 500 http://localhost:1234/
내 시스템에서 벤치 마크는 500 개의 동시 요청을 모두 처리하는 데 총 5043ms가 걸립니다. 웹 사이트 당 연결 수를 제한하는 것은 브라우저뿐입니다.
Go 프로그램을 벤치마킹하는 것은 쉽지 않습니다. 벤치 마크 도구가 병목 현상이 아닌지 확인하고 동시에 많은 연결을 처리 할 수 있는지 확인해야하기 때문입니다. 따라서 부하를 생성하기 위해 두 대의 전용 컴퓨터를 사용하는 것이 좋습니다.
Server.go에서 연결이 수락되면 Serve 함수에서 go 루틴이 생성됩니다. 아래는 스 니펫입니다.
// Serve accepts incoming connections on the Listener l, creating a
// new service goroutine for each. The service goroutines read requests and
// then call srv.Handler to reply to them.
func (srv *Server) Serve(l net.Listener) error {
for {
rw, e := l.Accept()
if e != nil {
......
c, err := srv.newConn(rw)
if err != nil {
continue
}
c.setState(c.rwc, StateNew) // before Serve can return
go c.serve()
}
}
xhr 요청을 사용하는 경우 xhr 인스턴스가 지역 변수인지 확인하십시오.
For example, xhr = new XMLHttpRequest()
is a global variable. When you do parallel request with the same xhr variable you receive only one result. So, you must declare xhr locally like this var xhr = new XMLHttpRequest()
.
'Programing' 카테고리의 다른 글
크롬 확장 프로그램에 정보를 로컬로 저장하려면 어떻게해야합니까? (0) | 2020.12.12 |
---|---|
applyBindings에서 Knockout 발생 클릭 바인딩 (0) | 2020.12.12 |
Git 파일을 커밋하려고하지만 :: 치명적 : LF가 CRLF로 대체됩니다. (0) | 2020.12.12 |
매우 큰 'n'에 대한 n 번째 피보나치 수 찾기 (0) | 2020.12.11 |
브라우저 닫기 이벤트 감지 시도 (0) | 2020.12.11 |