当前位置 : 主页 > 大数据 > 区块链 >

net / rpc .Call vs .Go有什么区别?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我刚刚开始使用Golang和net / rpc包.我试图了解你何时可以使用异步client.Go()调用client.Call()方法在线使用大多数示例.会通过类似的方式异步调用client.Call go client.Call(...) 基本上与使用clien
我刚刚开始使用Golang和net / rpc包.我试图了解你何时可以使用异步client.Go()调用client.Call()方法在线使用大多数示例.会通过类似的方式异步调用client.Call

go client.Call(...)

基本上与使用client.Go电话相同?我也在网上看过这个例子(例如在调用多个同时发送的RPC时).

如 documented:

Go invokes the function asynchronously. It returns the Call structure representing the invocation. The done channel will signal when the call is complete by returning the same Call object. If done is nil, Go will allocate a new channel. If non-nil, done must be buffered or Go will deliberately crash.

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

到contrast:

Call invokes the named function, waits for it to complete, and returns its error status.

这两种方法都不能直接在goroutine中执行* – 这是作为调用者的练习(因此可能会认为Go是一个误称).

如果你看一下source to 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,因为这是一个非阻塞操作.

网友评论