首页  >  文章  >  后端开发  >  HTTP 响应发送后我的 Goroutine 会完成吗?

HTTP 响应发送后我的 Goroutine 会完成吗?

Barbara Streisand
Barbara Streisand原创
2024-11-25 21:38:14663浏览

Will My Goroutine Finish After the HTTP Response is Sent?

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)
}

此代码在 HomeHandler 中启动一个 goroutine,该 goroutine 在打印完成之前休眠 10 秒。一旦写入响应,主协程就会从 HomeHandler 函数返回。

Goroutine 会完成吗?

在这个特定场景中,goroutine 确实会完成其执行,打印语句“worker开始”和“工作人员已完成”到控制台。这是因为:

  • goroutine 作为单独的执行线程启动,独立于处理 HTTP 请求的主 goroutine。
  • worker 函数是一个轻量级线程,它不会不会消耗大量资源,所以不太可能因为系统资源限制而停止。
  • main goroutine 只从 HomeHandler 函数返回,而不是从main() 函数。这意味着程序继续在后台运行,让 goroutine 完成执行。

在这种情况下提前终止 goroutine 的唯一方法就是遇到不稳定的状态,例如正在运行内存不足,或者使用同步技术显式停止 goroutine(本代码示例中未涵盖)。

以上是HTTP 响应发送后我的 Goroutine 会完成吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn