加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang http处理程序 – 请求所需的时间

发布时间:2020-12-16 09:24:48 所属栏目:大数据 来源:网络整理
导读:我正在尝试设置一个计时器来计算我的服务器完成请求所需的时间,我希望计时器在响应的最后一个字节发送后停止. 我发现http服务器只会在处理函数返回后发送响应. 有没有办法在发送响应后添加回调? 或者有更好的方法来计算从请求的第一个字节到响应的最后一个
我正在尝试设置一个计时器来计算我的服务器完成请求所需的时间,我希望计时器在响应的最后一个字节发送后停止.

我发现http服务器只会在处理函数返回后发送响应.

有没有办法在发送响应后添加回调?

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

解决方法

更容易但不那么准确的方法是使用中间件来包装你的处理函数.

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

06003

}

注意:请求实际上是在l.Accept()内部的net.Conn中写入的,但突出显示的点是我们可以在代码中的相同范围内具有大致开始时间和结束时间的唯一位置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读