Goroutine在http处理程序内执行

时间:2015-06-29 13:22:37

标签: http go goroutine

如果我在http处理程序中启动goroutine,即使在返回响应后它是否会完成?这是一个示例代码:

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 goroutine是否会在所有情况下完成?或者是否有任何特殊情况无法完成?

2 个答案:

答案 0 :(得分:6)

是的,它会完成,没有什么能阻止它。

阻止goroutine完成“从外部”的唯一办法是从main()函数返回(这也意味着完成程序的执行,但这绝不会发生在你的案件)。以及其他导致内存不稳定状态的情况。

答案 1 :(得分:4)

是的,它完全独立于您的请求。

这对于完成与您的响应无关的数据库更新等慢速操作非常有用(例如:更新视图计数器)。