登录
首页 >  Golang >  Go问答

golang http.ResponseWriter 出现未预期现象

来源:SegmentFault

时间:2023-01-24 14:58:28 388浏览 收藏

本篇文章给大家分享《golang http.ResponseWriter 出现未预期现象》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

服务端代码运行在 arm 上,大致思路如下,

func exampleHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "example handler")
    md5BigFile(); // 耗时 8s 左右
}

在返回结果之后,又做了一个 cpu 密集操作。

在客户端调试发现,总是需要等待 8s 左右,才能收到字符串

example handler
。只要我把
md5BigFile()
函数注释,就没有问题。

我猜测 ResponseWriter 把数据发进内核后,cpu 又被立即占满,导致无法及时发送出去。

我去查了一下 golang 默认是 nodelay 的,那怎么还出现这种问题呢?或许是我忽略了什么,还请各位大兄弟指点一下。

正确答案

HTTP 协议并不是一个 stream,它的返回是“一个”完整的结构,它是由明确是结束标志的。

只有当所有需要传输的内容都已经发送之后,这个结构的才可以“结束”。

http Server只有当 handler 函数返回才会认为发送结束了,并结束这个“结构”。

作为客户端,即使提前收到了 "example handler" (也许能,也许不能,看服务器实现),由于返回并没有结束,它可能也不会将已经收到的“部分”内容返回,而是一直等到收到“结束标志”。


ResponseWriter并不会直接将内容写进网络连接,因为这不是网络连接实际需要传输的内容。它需要根据内容构建一个 HTTP Response 结构,然后再将这个结构整体写入网络连接。

终于介绍完啦!小伙伴们,这篇关于《golang http.ResponseWriter 出现未预期现象》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表