Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.9k views
in Technique[技术] by (71.8m points)

golang http.ResponseWriter 出现未预期现象

服务端代码运行在 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 的,那怎么还出现这种问题呢?或许是我忽略了什么,还请各位大兄弟指点一下。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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

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

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


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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...