golang rpc源码问题记录

栏目: Go · 发布时间: 7年前

内容简介:数据结构在结构体Server中维护了freeReq, freeResp链表,用于复用request和response。 但是在getRequest函数里, 源码中将freeReq头节点指向第二个节点, 并新建了一个Request{}作为结果返回。正确的做法应该是将头节点从链表中删除,然后将头节点返回,从而达到对象复用的效果。
  1. 源码位置 net/rpc/server.go

数据结构

// Server represents an RPC Server.

type Server struct {

serviceMap sync.Map  // map[string]*service

  reqLock    sync.Mutex // protects freeReq

  freeReq    *Request

  respLock  sync.Mutex // protects freeResp

  freeResp  *Response

}

// 成员函数

func (server *Server)freeRequest(req *Request)

func (server *Server)getRequest() *Request {

        server.reqLock.Lock()

        req := server.freeReq

        if req == nil {

            req =new(Request)

        }else {

            server.freeReq = req.next

            //错误, 此处新建了Request,取代了req原始指向的对象, 应该删除此行,直接返回req, 达到Request对象复用的效果

            *req =Request{}

        }

        server.reqLock.Unlock()

        return req

}

在结构体Server中维护了freeReq, freeResp链表,用于复用request和response。 但是在getRequest函数里, 源码中将freeReq头节点指向第二个节点, 并新建了一个Request{}作为结果返回。正确的做法应该是将头节点从链表中删除,然后将头节点返回,从而达到对象复用的效果。


以上所述就是小编给大家介绍的《golang rpc源码问题记录》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

拆掉互联网那堵墙

拆掉互联网那堵墙

庄良基 / 经济日报出版社 / 2014-6 / 25.80

都在说道互联网、说道电子商务、说道移动APP、说道微信、说道互联网金融......我们该如何认识互联网?中小微企业该如何借力互联网?互联网很神秘吗?很高深莫测吗? 其实互联网并没有什么神秘的,也没有什么高深莫测的!互联网无非是人类发明的工具而已,既然是工具,我们就一定可以驾驭和使用它。既然可以双重使用,就理当让所有有人都容易掌握并轻松驾驭。 互联网离我们很远吗?互联网界的成功故事都是那......一起来看看 《拆掉互联网那堵墙》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码