2012-06-25 32 views
9

我正在玩去HTTP包。我想像java一樣處理請求。但我不能。如何在編程語言中處理並行HTTP請求?

我創建了一個簡單的Web服務器,在中間休眠並意識到每次處理一個請求,所以如果我在瀏覽器上進行刷新,第一個請求的處理必須完成,直到第二個請求開始處理,這裏是代碼:

func main(){ 

    //Process the http commands 
    fmt.Printf("Starting http Server ... ") 
    http.Handle("/", http.HandlerFunc(sayHello)) 
    err := http.ListenAndServe("0.0.0.0:8080", nil) 
    if err != nil { 
     fmt.Printf("ListenAndServe Error",err) 
    } 
} 

func sayHello(c http.ResponseWriter, req *http.Request) { 
    fmt.Printf("New Request\n") 
    processRequest(c, req) 
} 

func processRequest(w http.ResponseWriter, req *http.Request){ 
    time.Sleep(time.Second*3) 
    w.Write([]byte("Go Say’s Hello(Via http)")) 
    fmt.Println("End") 
} 

正如我想並行處理兩個請求我加入之前的「go」命令「的processRequest(C,REQ)」中的「sayHello的」功能,以處理每個請求在不同的gorutine。但是......它不起作用......我不知道爲什麼。我知道這兩個請求都被處理,因爲我在控制檯看到了打印的行,但瀏覽器一直在等待信息.....並且不顯示我的迴應。

所以...我的問題,

是否每個請求創建一個新的http.ResponseWriter?或者它使用相同? 您是否知道如何指示Web服務器使用不同線程處理每個請求?

任何幫助,歡迎....

Fersca

回答

20

所有連接自動同時處理。每個TCP連接(不是請求)都有自己的goroutine。

在一個使用http流水線和瀏覽器重用連接的世界裏,這可能並不總能奏效。很可能您的瀏覽器正在重新使用連接,直到goroutine處理完當前請求爲止。

+0

謝謝。因爲瀏覽器太聰明的行爲,今天浪費了很多時間:) –

0

爲了使運行時支持利用你可能想通過設置這個數字超過一個操作系統的線程:

runtime.GOMAXPROCS(n) 

或設置GOMAXPROCS環境變量。

要獲取可用內核的數量,使用

runtime.NumCPU() 

所以你往往最終與

runtime.GOMAXPROCS(runtime.NumCPU()) 
+0

這沒有幫助。 Go默認是併發的,只是沒有多線程(兩者之間有很大的差異)。它會切換到一個不同的goroutine來阻止諸如'time.Sleep()'和'.Write()'之類的調用。 – ayke

0

我覺得你的瀏覽器在等待,因爲你沒有發回響應它 你的瀏覽器發出了一個請求,說你好,然後說你好還提出了一個請求processRequest, 從你的代碼processRequest發回了一個響應sayHello但是說你沒有發回一個響應給瀏覽器。

您可以使用http.Get或http.Post調用processRequest