golang http.ResponseWriter 出现未预期现象
本篇文章给大家分享《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相关知识,快来关注吧!
zap defer logger.Sync() 这个方法什么场景会用到
- 上一篇
- zap defer logger.Sync() 这个方法什么场景会用到
- 下一篇
- golang在有default的select语句中为何无法收到channel中传递的os.Signal?
-
- 欣喜的柠檬
- 这篇技术文章真及时,细节满满,很棒,码起来,关注师傅了!希望师傅能多写Golang相关的文章。
- 2023-03-21 19:32:06
-
- 调皮的薯片
- 赞 ??,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢师傅分享技术贴!
- 2023-03-02 10:28:36
-
- 沉默的老鼠
- 这篇博文真及时,太全面了,太给力了,收藏了,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-02-07 23:27:29
-
- Golang · Go问答 | 1小时前 |
- Go elf.ImportedSymbols 为什么不包含弱符号
- 455浏览 收藏
-
- Golang · Go问答 | 13小时前 |
- Go strings.Count 怎样统计重叠子串
- 253浏览 收藏
-
- Golang · Go问答 | 13小时前 |
- Go strings.Builder 不生效怎么办
- 433浏览 收藏
-
- Golang · Go问答 | 13小时前 |
- Go os.Root 怎样限制文件操作范围
- 278浏览 收藏
-
- Golang · Go问答 | 13小时前 |
- Go strconv.ParseInt 为什么 base=0 时下划线才可用
- 361浏览 收藏
-
- Golang · Go问答 | 13小时前 |
- Go strconv.ParseInt 为什么在边界输入上得到空结果
- 200浏览 收藏
-
- Golang · Go问答 | 13小时前 |
- Go sort.Search 不生效怎么办
- 495浏览 收藏
-
- Golang · Go问答 | 13小时前 | 并发 · 标准库 · IO · Go问答 · Go io.Pipe PipeWriter PipeReader 读写阻塞
- Go io.Pipe 怎样避免读写端互相阻塞
- 176浏览 收藏
-
- Golang · Go问答 | 13小时前 |
- Go runtime.SetFinalizer 不生效怎么办
- 434浏览 收藏
-
- Golang · Go问答 | 14小时前 | 标准库 · Go问答 · Go ErrBadPattern path.Match 资源未释放 资源排查
- Go path.Match 怎样定位资源未释放
- 426浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 920次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 925次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1024次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1003次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 829次使用
-
- Go map 并发写 panic 怎么办:从共享 map 到可控写入路径
- 2026-06-30 123浏览
-
- Go语言TCP从原理到代码实现详解
- 2022-12-30 488浏览
-
- Golang实现HTTP编程请求和响应
- 2022-12-28 101浏览
-
- golangNewRequest/gorequest实现http请求的示例代码
- 2023-01-24 343浏览
-
- 一文详解Golang中net/http包的实现原理
- 2022-12-29 419浏览

