猿问

在 http 处理程序中执行 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)

}

在上面的例子中,workergoroutine 会在所有情况下都完成吗?或者有什么特殊情况不会完成?


呼唤远方
浏览 187回答 2
2回答

拉风的咖菲猫

是的,它会完成,没有什么能阻止它。阻止goroutines “从外部”完成的唯一事情是从main()函数返回(这也意味着完成程序的执行,但这在你的情况下永远不会发生)。以及其他导致不稳定状态的情况,例如内存不足。

GCT1015

是的,它将完全独立于您的请求而完成。这对于完成缓慢的操作非常有用,例如与您的响应无关的数据库更新(例如:更新视图计数器)。
随时随地看视频慕课网APP

相关分类

Go
我要回答