【问题标题】:RPC response not correctRPC 响应不正确
【发布时间】:2021-05-31 18:31:57
【问题描述】:

我正在尝试使用一个远程过程,它将在一个结构中设置一个回复,一个布尔状态和一个字符串作为下一个输入。 在该过程中,我将布尔状态设置为 true 并将一个值放入输入中。 但是在客户端,它会得到一个错误的状态和空字符串。 在程序中:

func(c *Coordinator)MapJob(req mr.MapRequest, reply *mr.MapResponse) error {
    //logic to set up response...
    reply = &mr.MapResponse{
        Status: newStatus,
        Input:  newIn,
    }
    fmt.Printf("[REPLY] %+v\n", reply)

    return nil
}

打印[REPLY] &{Status:true Input:1.txt}

在客户端时:

err := client.Call("Coordinator.MapJob", req, &reply)
        fmt.Printf("reply from procedure %+v\n", reply)

打印:reply from procedure {Status:false Input:}

我在这里缺少什么? 我已经把整个代码放在https://github.com/Brotchu/ProjectMR 该过程在协调器中定义,在工作者中定义客户端。 在这里粘贴可能太多了。

【问题讨论】:

    标签: go rpc


    【解决方案1】:

    客户端结构看起来只包含零值(false 和空字符串)。

    我认为client.Call 调用不会改变回复。我认为这是因为MapJob 也不会改变回复。

    reply = &mr.MapResponse{
            Status: newStatus,
            Input:  newIn,
        }
    

    应该是

    reply.Status = newStatus
    reply.Input =  newIn
    

    【讨论】:

    • 那行得通。所以,据我了解,当我回复 = &mr.MapResponse{} 时,我将一个新地址放入回复中,而来自客户端的实际地址并未发生突变。这是正确的说法吗?
    【解决方案2】:

    你必须更改调用过程中传递的回复值,所以替换

    reply = &mr.MapResponse{
        Status: newStatus,
        Input:  newIn,
    }
    

    *reply = mr.MapResponse{
        Status: newStatus,
        Input:  newIn,
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-03
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2019-02-14
      • 2014-05-12
      • 1970-01-01
      相关资源
      最近更新 更多