HTTP 处理程序中的 Goroutine 执行
在 HTTP 处理程序中使用 Goroutine 时,很自然地想知道返回响应后它们的完成状态。让我们探索一下提供的示例代码:
// Handler that starts a goroutine func HomeHandler(w http.ResponseWriter, r *http.Request) { go worker() // Starts a goroutine called "worker" w.Write([]byte("Hello, World!")) // Sends a response to the client }
问题出现了:即使在发送 HTTP 响应之后,“worker”goroutine 也会始终完成吗?
答案
是的,“worker”goroutine 在所有情况下都会完成。原因如下:
Goroutines 是与主程序同时运行的轻量级线程。使用 go 启动一个 goroutine 会为其分配一个堆栈并抢占其执行。一旦创建了 goroutine,它就会独立于主程序运行,即使在当前函数(在本例中为 HomeHandler)返回之后也是如此。
在提供的示例中,goroutine 在 go worker 之后立即开始执行() 线。它打印一条消息来指示其开始,然后休眠 10 秒,然后打印完成消息。
当 goroutine 运行时,HomeHandler 函数继续执行并将响应发送到客户端。然后,服务器将请求标记为已完成并返回到侦听器,等待更多请求。
由于“worker”goroutine 独立于处理程序,因此即使在发送 HTTP 响应后它也会继续运行。操作系统的调度程序允许它与其他 goroutine 共享 CPU,最终它会完成睡眠并打印完成消息。
例外情况
有只有少数特殊情况下 Goroutine 可能无法完成:
但是,在像您的示例中提供的稳定且编写良好的程序中,goroutine 应该成功完成其任务。
以上是HTTP 处理程序中的 Goroutine 总是在响应发送后完成吗?的详细内容。更多信息请关注PHP中文网其他相关文章!