mouse老师,我想问一下http库里请求相关的一些实现原理,求解答

来源:1-1 Google资深工程师深度讲解go语言

Barrel

2021-07-02

问:
我使用http.get()请求一个1G左右的文件,和请求1mb左右的文件执行的速度差不多这是为什么呢?只有在真正读取数据到内存的时候才会体现快慢,这里面是什么样的原理呢?

resp, _ := http.get(url) // 这里文件不管是1G or 1M执行的都非常快
ioutil.ReadAll(resp.Body) // 这里读取的时候1G or 1M的速度才不一样

答:
难道是懒惰执行之类的?只有在用到数据的时候才会去拿?求解答

写回答

1回答

ccmouse

2021-07-04

这个问题很好,它的确是这样,所以api才设计成返回一个类型是Reader的Body,而不是直接返回获取的内容。这样用户可以边读取边处理,而不是等一个很大的请求完全返回后才处理。

它在http.get时只是建立连接,在Body.Read的时候才开始真正读取数据。我在http.Get及resp.Body.Read之间sleep了30秒,做了个抓包实验:

//img.mukewang.com/szimg/60e1435709bb994f27021014.jpg

我们看到初始的数据读完之后,它把Window的size设成了0,并不断发送这个zero-window的消息,以维持链接。待30秒到了以后,更新window size后开始收取数据。

具体实现的细节非常多,我这里找了两篇比较低层的文章共参考:

https://www.cnblogs.com/lshs/p/6038654.html

https://segmentfault.com/a/1190000024584420


1
1
Barrel
太棒了😊
2021-07-04
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程