Programing

Golang의 웹 서버가 동시 요청을 처리하지 않는 이유는 무엇입니까?

lottogame 2020. 12. 12. 09:54
반응형

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에서 답을 찾을 수 없었기 때문에 어쨌든 게시하고 있습니다. 내가 뭘 잘못하고 있는지 볼 수 있습니까?


프로그램은 이미 요청을 동시에 처리합니다. abApache 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().

참고URL : https://stackoverflow.com/questions/10720867/why-is-my-webserver-in-golang-not-handling-concurrent-requests

반응형