gpt4 book ai didi

Golang http 处理程序 - 请求所用的时间

转载 作者:IT王子 更新时间:2023-10-29 01:19:21 41 4
gpt4 key购买 nike

我正在尝试设置一个计时器来计算我的服务器完成请求所需的时间,并且我希望计时器在发送响应的最后一个字节后停止。

我发现http服务器只有在handler函数返回后才会发送response。

有什么方法可以在发送响应后添加回调吗?

或者是否有更好的方法来计算从收到请求的第一个字节到发送响应的最后一个字节所花费的时间?

最佳答案

更简单但不太准确的方法是使用中间件来包装您的处理函数。

func timer(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
startTime := time.Now()
h.ServeHTTP(w, r)
duration := time.Now().Sub(startTime)
})
}

然后

http.Handle("/route",timer(yourHandler))

这更准确地说是处理请求和形成响应所花费的时间,而不是写入之间的时间。


如果您绝对需要更准确的持续时间,那么您要更改的代码部分位于 net/http 包中。

大概是here .

突出显示的行 go c.serve(ctx) 是生成用于为请求提供服务的 go 例程的地方。

for {
rw, e := l.Accept()
if e != nil {
if ne, ok := e.(net.Error); ok && ne.Temporary() {
if tempDelay == 0 {
tempDelay = 5 * time.Millisecond
} else {
tempDelay *= 2
}
if max := 1 * time.Second; tempDelay > max {
tempDelay = max
}
srv.logf("http: Accept error: %v; retrying in %v", e, tempDelay)
time.Sleep(tempDelay)
continue
}
return e
}
tempDelay = 0

c := srv.newConn(rw)
c.setState(c.rwc, StateNew) // before Serve can return
    go func(){
startTime := time.Now()
c.serve(ctx)
duration := time.Now().Sub(startTime)
}()
}

注意:请求实际上是写在 l.Accept() 内的 net.Conn 中的某个地方,但突出显示的点是我们唯一可以获得近似值的地方代码中相同范围内的开始时间和结束时间。

关于Golang http 处理程序 - 请求所用的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40601862/

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