折腾一周的,只因为没有好好去利用response.Body,导致链接不释放。golang

想去看看http里Transport里的dialer函数到底是怎么用的,但是发现链接总是没有被复用啊,几遍是发现调用了:response.Body.Close(),发现也是于事无补啊,还是不能复用之前的链接,这到底是咋回事呢,【这就是完全的小白了,如果经常做网络的开发,那么很容易会想到说数据还是在socket上存储的,所以这个链接相当于是个不干净的链接】所以肯定是释放不了了。其实这里的本质还是自己对conn没理解透,这个conn其实是一个socket,就是传统的socket编程,socket不单单是一个五元组,还包括tcp缓存上的数据。数据都没清理,golang里的策略就是不释放,这个应该也没有什么问题。如果是其他的语言,这里我立即close的时候,清除掉socket里的数据感觉也没有问题。

这种链接是不可以复用的,所以当Bodyclose的时候,这个链接就直接释放掉了。释放掉了之后,会触发到

2102 func (pc *persistConn) readLoop() {
2103   closeErr := errReadLoopExiting // default value, if not changed below
2104   defer func() {
2105     pc.close(closeErr)
2106     res := pc.t.removeIdleConn(pc)
2107     fmt.Println("ReadLoop Done: Remove(%d)", res)
2108     // 直接给释放掉了
2109     // readLoop是控制全场的
2110   }()

 下面来看一下,readLoop是怎么判断的IO

原文地址:https://www.cnblogs.com/honpey/p/14350583.html