我正在使用golang創建一個簡單的http服務器。我有兩個問題,一個更理論,另一個關於真正的計劃。golang併發http請求處理
- 併發請求處理
我創建了一個服務器,並使用s.ListenAndServe()來處理請求。我很瞭解同時服務的請求。我用一個簡單的處理程序,以檢查它:
func ServeHTTP(rw http.ResponseWriter, request *http.Request) {
fmt.Println("1")
time.Sleep(1 * time.Second) //Phase 2 delete this line
fmt.Fprintln(rw, "Hello, world.")
fmt.Println("2")
}
我看到,如果我發送多個請求,我會看到所有的「1」的出現,只有經過第二所有的「2」出現。 但是,如果我刪除睡眠線,我看到該程序從未開始一個請求,在它完成前一個(輸出是1 2 1 2 1 2 ...)。 所以我不明白,如果他們是並行的或不真的。如果他們是我希望看到在打印一些亂七八糟......
- 現實生活中的問題
在實際處理程序,我請求發送到另一臺服務器並將答案返回給用戶(對請求和答案進行了一些更改,但在想法上它是一種代理)。所有這一切都需要時間,並且從看到的東西(通過向處理程序添加一些打印件)中,請求被逐個處理,它們之間沒有併發(我的打印件向我顯示請求開始,執行所有步驟,結束,只有我看到一個新的開始....)。 我能做些什麼來使它們真正併發?
把處理函數作爲goroutine給出錯誤,請求的主體已經關閉。另外,如果它已經同時增加更多goroutines將使事情變得更糟。
謝謝!
這些請求默認是併發的。除非您使用goroutines,否則處理程序內部的任何內容都是連續的。 –
您檢查請求是否被併發處理的方式是有缺陷的。所有的請求總是以並行的方式進行處理,無論您的打印報告如何讓您思考。 – Volker
我建議你發送併發請求到你的服務器,看看會發生什麼! –