2015-06-29 109 views
3

如果我在http處理程序中啓動goroutine,即使在返回響應後它是否會完成?下面是一個例子代碼:Goroutine在http處理程序中執行

package main 

import (
    "fmt" 
    "net/http" 
    "time" 
) 

func worker() { 
    fmt.Println("worker started") 
    time.Sleep(time.Second * 10) 
    fmt.Println("worker completed") 
} 

func HomeHandler(w http.ResponseWriter, r *http.Request) { 
    go worker() 
    w.Write([]byte("Hello, World!")) 
} 

func main() { 
    http.HandleFunc("/home", HomeHandler) 
    http.ListenAndServe(":8081", nil) 
} 

在上面的例子中,是worker夠程將完成在所有情況下?或者當它沒有完成時有沒有特殊情況?

回答

6

是的,它會完成,沒有什麼能阻止它。

時停止夠程結束「從外面」唯一從main()函數返回(這也意味着你完成程序的執行,但在你的情況從未發生過)。以及導致不穩定狀態的其他情況,如內存不足。

4

是的,它會完全獨立於您的請求。

這對於完成與您的響應無關的緩慢操作(例如數據庫更新)(例如:更新視圖計數器)非常有用。

+0

爲什麼downvote? – inf