此前的標題爲:如何根據HTTP請求產生goroutine?爲什麼不在HTTP 47中爲HTTP請求產生每個請求的goroutine?
下面的代碼是一個簡單的HTTP服務器,它將路徑回顯給請求者。我用它來測試默認情況下net/http
包的ListenAndServe
方法是否觸發一個goroutine來處理每個請求;我發現它沒有。如果我同時提出三個請求,第一個需要10秒返回,第二個20(第一個返回後10秒),第三個30秒。
package main
import (
"fmt"
"net/http"
"time"
)
func handler(w http.ResponseWriter, r *http.Request) {
time.Sleep(10000 * time.Millisecond)
fmt.Fprint(w, r.URL.Path)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
基本上我想主要是夠程監聽HTTP連接,然後將請求的閱讀和處理程序的響應在另一個goroutine中催生。
有人可以指出我在正確的方向來完成這個嗎?最好使用net/http
包。
UPDATE 15年12月21日上午08時46 MST
我進行了完全相同的測試,你沒有使用我的網頁瀏覽器(Chrome 47),在本地主機的根五個請求:8080,和結果大致是:
1st: 10 seconds
2nd: 20 seconds
3rd: 30 seconds
4th: 36 seconds
5th: 38 seconds
所以,我希望,誰否則將向下投我的問題的人們會理解我的困惑,爲什麼我的假設我做到了。我不知道爲什麼我得到了我在第4次和第5次請求中所做的結果。
我使用curl運行了相同的測試,結果與@tomasz相同。我正在使用go1.2.1
。
UPDATE 15年12月21日下午2時08分MST
每低於@托馬斯的建議,我改名這個問題從「如何產卵每個HTTP請求的goroutine」到「爲什麼不走這個HTTP服務器在Chrome 47的每個請求中產生一個goroutine?「
我明白你的困惑。你已經看到了一些行爲並做出了錯誤的結論,然後基於此你提出了你的問題。它的措辭很好,所以我能夠回答。我猜如果你跳過關於例程的結論,只是問爲什麼這種方式不能按預期工作,你會有更多的運氣,並收集一些upvotes。這種或那種方式我希望你的問題現在已經解決了。根據我的更新,您還可以在Chrome中通過打開多個標籤並使用不同的URL來正確顯示此功能。 – tomasz
您現在可能已經意識到了這一點,但排除基本HTTP時首先要做的是讓瀏覽器脫離等式 - 僅介紹特定於瀏覽器的行爲。另外,更新你的Go安裝,使用這樣一箇舊版本進行學習只會妨礙你使用不匹配的文檔和可能缺少的功能。 – JimB