zoukankan      html  css  js  c++  java
  • 折腾一周的,只因为没有好好去利用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

  • 相关阅读:
    《剑指offer》39题—数组中出现次数超过一半的数字
    常见排序算法实现
    剑指offer题目分类
    腾讯2019实习面试题
    Word2vec资料
    Hello World投票以太坊Dapp教程-Part1
    以太坊开发框架Truffle学习笔记
    linux查看端口进程占用情况
    重置fedora root密码
    docker挂载本地目录的方法总结
  • 原文地址:https://www.cnblogs.com/honpey/p/14350583.html
Copyright © 2011-2022 走看看