在 http 处理程序中执行 Goroutine
Goroutine execution inside an http handler
如果我在 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 会在所有情况下完成吗?还是有什么特殊情况不会完成?
是的,它将完全独立于您的请求完成。
这对于完成缓慢的操作很有用,例如与您的响应无关的数据库更新(例如:更新查看计数器)。
是的,它会完成,没有什么能阻止它。
唯一阻止 goroutines 完成 "from the outside" 的是从 main()
函数返回(这也意味着完成程序的执行,但是这在你的情况下永远不会发生)。以及其他导致不稳定状态的情况,例如 运行 内存不足。
如果我在 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 会在所有情况下完成吗?还是有什么特殊情况不会完成?
是的,它将完全独立于您的请求完成。
这对于完成缓慢的操作很有用,例如与您的响应无关的数据库更新(例如:更新查看计数器)。
是的,它会完成,没有什么能阻止它。
唯一阻止 goroutines 完成 "from the outside" 的是从 main()
函数返回(这也意味着完成程序的执行,但是这在你的情况下永远不会发生)。以及其他导致不稳定状态的情况,例如 运行 内存不足。