美文网首页
golang rpc源码问题记录

golang rpc源码问题记录

作者: xikaka | 来源:发表于2018-09-06 16:45 被阅读0次
    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源码问题记录

          本文链接:https://www.haomeiwen.com/subject/ewixgftx.html