2015-12-20 122 views
1

此前的標題爲:如何根據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?「

+0

我明白你的困惑。你已經看到了一些行爲並做出了錯誤的結論,然後基於此你提出了你的問題。它的措辭很好,所以我能夠回答。我猜如果你跳過關於例程的結論,只是問爲什麼這種方式不能按預期工作,你會有更多的運氣,並收集一些upvotes。這種或那種方式我希望你的問題現在已經解決了。根據我的更新,您還可以在Chrome中通過打開多個標籤並使用不同的URL來正確顯示此功能。 – tomasz

+0

您現在可能已經意識到了這一點,但排除基本HTTP時首先要做的是讓瀏覽器脫離等式 - 僅介紹特定於瀏覽器的行爲。另外,更新你的Go安裝,使用這樣一箇舊版本進行學習只會妨礙你使用不匹配的文檔和可能缺少的功能。 – JimB

回答

11

一切都很好,您的處理程序在每個請求的獨立例程中運行。看看http.Server.Serve方法的源代碼。接受循環的最後一行說:

go c.serve() 

這個問題可能與您的測試。如果您通過瀏覽器中的多個選項卡檢查行爲,匹配URL的請求可能會排隊,而不是同時運行(即您的客戶端不使用「例程」,而不是服務器)。

嘗試使用兩種不同的瀏覽器,或者只使用命令行,例如curl來並行測試請求。例如(在bash的幫助下):

$ for i in {1..5}; do time curl localhost:8080 &; done 
# after ignoring some mess... 
curl localhost:8080 0.00s user 0.00s system 0% cpu 10.013 total 
curl localhost:8080 0.00s user 0.00s system 0% cpu 10.014 total 
curl localhost:8080 0.00s user 0.00s system 0% cpu 10.012 total 
curl localhost:8080 0.00s user 0.00s system 0% cpu 10.019 total 

你的服務器就像一個魅力。

更新

我可以證實,在Chrome 47這種行爲,但也注意到,你可以打開多個標籤用,比如說,http://localhost:8080/test1http://localhost:8080/test2等,您將得到預期的結果。這表明Chrome中確實存在一些排隊機制來匹配網址。