gpt4 book ai didi

http - http.TimeoutHandler返回,但是handlerfunc继续运行

转载 作者:行者123 更新时间:2023-12-01 22:07:15 26 4
gpt4 key购买 nike

我正在测试Go Web服务器中的http.timeoutHandler,我注意到3秒钟后我的客户调用收到“Timeout”消息,但是2秒钟后,我可以在服务器上看到消息“My func Println”。为什么TimeoutHandler没有取消我的func1

这是我正在使用的代码:

package main

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

func func1(w http.ResponseWriter, req *http.Request) {
time.Sleep(5 * time.Second)
fmt.Println("My func Println")
io.WriteString(w, "My func!\n")
}

func main() {
srv := http.Server{
Addr: ":9000",
WriteTimeout: 5 * time.Second,
Handler: http.TimeoutHandler(http.HandlerFunc(func1), 3*time.Second, "Timeout!\n"),
}

if err := srv.ListenAndServe(); err != nil {
fmt.Printf("Server failed: %s\n", err)
}
}

最佳答案

是的,这就是它的预期工作方式。

当超时发生并且您的处理函数仍然运行(未返回)时,请求的上下文将被取消。您的处理程序负责监视上下文的“完成” channel ,如果请求取消,则中止其工作。每个处理程序都在自己的goroutine中运行,并且goroutine不能从“外部”杀死或中断。

示例如何做:

func func1(w http.ResponseWriter, req *http.Request) {
select {
case <-time.After(5 * time.Second):
fmt.Println("My func Println")
io.WriteString(w, "My func!\n")
case <-req.Context().Done():
fmt.Println("Cancelled")
}
}

这将输出:
Cancelled

如果您将处理程序中的延迟更改为2秒:
case <-time.After(2 * time.Second):

输出为:
My func Println

客户端收到发送的数据:
My func!

关于http - http.TimeoutHandler返回,但是handlerfunc继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60737889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com