• 折腾一周的,只因为没有好好去利用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

  • 相关阅读:
    缓冲流
    properties类
    io流
    异常处理
    file的概述和作用
    map集合和set集合
    js 判断是否是undefined null NaN
    java instanceof 判断是否是String
    ajax获取数据中文乱码问题最简单的完美解决方案
    if else if else if else 的用法
  • 原文地址:https://www.cnblogs.com/honpey/p/14350583.html
Copyright © 2020-2023  润新知