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

5

我刚开始学习Golang和net/rpc包。我正在努力理解什么时候可以使用异步客户端Go()调用,而不是大多数在线示例使用的client.Call()方法。如果通过类似于的方式异步调用client.Call

go client.Call(...)

本质上与使用client.Go调用相同吗?我也在网上看到了这个例子(例如在调用多个同时进行的RPC时)。

1个回答

8
文档所述:
Go异步调用函数。它返回表示调用的Call结构体。当调用完成时,done通道将发出信号并返回相同的Call对象。如果done为nil,则Go将分配一个新通道。如果非nil,则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
}

实际上,CallGo的封装,它会等待操作完成,而Go则是底层函数,将等待留给调用者。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接