Rest Goroutine已从请求在Go web服务器中启动,但客户端断开连接,web服务器是否可以关闭该特定Goroutine?

Rest Goroutine已从请求在Go web服务器中启动,但客户端断开连接,web服务器是否可以关闭该特定Goroutine?,rest,web-services,go,webserver,goroutine,Rest,Web Services,Go,Webserver,Goroutine,每当一个web请求从客户端传入时,它都会生成一个goroutine来处理每个请求。如果客户端恰好与连接断开,web服务器是否可能关闭该特定goroutine,或者该goroutine是否会发现客户端在执行其所有代码后已断开连接?如果读取或写入连接时出错,则从处理程序返回的每个连接goroutine将退出,或者当请求或响应头指示应关闭连接时 处理程序可以使用从返回的检查关闭的连接 如果读取或写入连接时出错,或者当请求或响应头指示应关闭连接时,每个连接goroutine将在处理程序返回时退出 处理程

每当一个web请求从客户端传入时,它都会生成一个goroutine来处理每个请求。如果客户端恰好与连接断开,web服务器是否可能关闭该特定goroutine,或者该goroutine是否会发现客户端在执行其所有代码后已断开连接?

如果读取或写入连接时出错,则从处理程序返回的每个连接goroutine将退出,或者当请求或响应头指示应关闭连接时


处理程序可以使用从返回的检查关闭的连接

如果读取或写入连接时出错,或者当请求或响应头指示应关闭连接时,每个连接goroutine将在处理程序返回时退出


处理程序可以使用从返回的检查关闭的连接

除了在读取或写入错误时从被调用的处理程序返回时退出之外,执行go例程不会自动处理清理较长时间运行的操作,但go提供了很好的处理方法

首先,如果您不熟悉-这是一种将go例程与取消行为同步的强大且惯用的方法,我强烈建议您阅读此博客

如下所示:

func MyServiceFunc(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            break
        default:
            //do work
        }
    }
}

func MyRequestHandler(res http.ResponseWriter, req *http.Request) {
    MyServiceFunc(req.Context())       
   //write response...
}
func myservicecfunc(ctx context.context){
为了{
挑选{

case除了在读取或写入错误时从被调用的处理程序返回时退出之外,执行go例程不会自动处理清理较长时间运行的操作,但go提供了很好的处理方法

首先,如果您不熟悉-这是一种将go例程与取消行为同步的强大且惯用的方法,我强烈建议您阅读此博客

如下所示:

func MyServiceFunc(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            break
        default:
            //do work
        }
    }
}

func MyRequestHandler(res http.ResponseWriter, req *http.Request) {
    MyServiceFunc(req.Context())       
   //write response...
}
func myservicecfunc(ctx context.context){
为了{
挑选{

case在处理程序返回后使用
http.ResponseWriter
无效。您的第一个示例不起作用。@JimB-谢谢您这么说,示例已更新。在处理程序返回后使用
http.ResponseWriter
无效。您的第一个示例不起作用。@JimB-谢谢您的帮助鉴于此,该示例已更新
func MyRequestHandler(res http.ResponseWriter, req *http.Request) {

    notifier := res.(http.CloseNotifier).CloseNotify()
    ctx, cancel := context.WithCancel(req.Context())

    go func(closer <-chan bool) {
        <-closer //the notifer blocks until the send
        cancel() //explicitly cancel all go routines
    }(notifier)

    go MyServiceFunc(ctx)
    MyOtherServiceFunc(ctx)
    //write response...
}