为了账号安全,请及时绑定邮箱和手机立即绑定

net/rpc .Call 与 .Go 之间有什么区别?

net/rpc .Call 与 .Go 之间有什么区别?

Go
哔哔one 2023-05-15 14:40:30
我刚刚开始使用 Golang 和 net/rpc 包。我试图了解您何时可以使用异步 client.Go() 调用大多数在线示例使用的 client.Call() 方法。会通过类似的方式异步调用 client.Callgo client.Call(...)本质上和使用 client.Go 调用是一样的吗?我也在网上看到过这个例子(例如当同时调用多个 RPC 时)。
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

记录在案:

Go 异步调用该函数。它返回表示调用的 Call 结构。done 通道将在调用完成时通过返回相同的 Call 对象发出信号。如果 done 为 nil,Go 将分配一个新频道。如果非零,则 done 必须被缓冲,否则 Go 会故意崩溃。


这意味着它发出命令,但不等待它完成。


相比之下:_


Call 调用命名函数,等待它完成,并返回它的错误状态。


这两种方法都不会直接在 goroutine 中执行*——这留给调用者作为练习(因此可能会提出一个用词Go不当的论点)。


如果您查看源代码Call,也许会更清楚:


func (client *Client) Call(serviceMethod string, args interface{}, reply 

interface{}) error {

    call := <-client.Go(serviceMethod, args, reply, make(chan *Call, 1)).Done

    return call.Error

}

所以实际上,Call是一个包装器Go,它等待操作完成,而Go是底层函数,等待调用者。


*显然,在后台某处涉及一个goroutine,因为这是一个非阻塞操作。


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信