You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何在连接断开时终止Handler函数?

Go HTTP Handler客户端断开后仍持续运行的问题处理

在Go的标准HTTP服务中,存在这样的现象:当客户端断开连接(比如访问页面后关闭浏览器),对应的Handler函数并不会立即停止,而是会继续执行直到函数自身返回。例如运行以下代码后,访问http://0.0.0.0:8000/home再关闭浏览器,程序会持续打印递增的数字:

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/home", func(w http.ResponseWriter, r *http.Request) {
        i := 0
        for {
            fmt.Println("i", i)
            i++
            time.Sleep(time.Millisecond * 15)
        }
    })
    http.ListenAndServe(":8000", nil)
}

问题原因

Go标准库的HTTP服务默认不会主动监听客户端连接状态,Handler函数的执行不受客户端连接断开的影响,会一直运行到逻辑结束。

解决方法

我们可以通过两种方式检测客户端连接是否关闭,从而终止Handler的执行:

方式1:利用请求Context的Done通道

每个http.Request都携带了一个Context,当客户端断开连接时,该Context的Done()通道会被触发,我们可以监听这个通道来终止循环:

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/home", func(w http.ResponseWriter, r *http.Request) {
        i := 0
        for {
            select {
            case <-r.Context().Done():
                fmt.Println("客户端连接已断开,终止执行")
                return
            default:
                fmt.Println("i", i)
                i++
                time.Sleep(time.Millisecond * 15)
            }
        }
    })
    http.ListenAndServe(":8000", nil)
}

方式2:使用ResponseWriter的CloseNotify通道

http.ResponseWriter的CloseNotify()方法会返回一个通道,当客户端关闭连接时,该通道会收到信号:

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/home", func(w http.ResponseWriter, r *http.Request) {
        closeChan := w.CloseNotify()
        i := 0
        for {
            select {
            case <-closeChan:
                fmt.Println("客户端连接已断开,终止执行")
                return
            default:
                fmt.Println("i", i)
                i++
                time.Sleep(time.Millisecond * 15)
            }
        }
    })
    http.ListenAndServe(":8000", nil)
}

这两种方式都能在客户端断开连接时及时终止Handler的执行,避免不必要的资源消耗。

内容的提问来源于stack exchange,提问作者Unknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:05:18