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

时间:2018-12-06 08:20:34

标签: go rpc

我刚开始使用Golang和net / rpc软件包。我试图了解您何时可以通过client.Call()方法使用异步client.Go()调用,大多数示例都可以在线使用。将调用client。通过

之类的方式异步调用
go client.Call(...)

本质上与使用client.Go呼叫相同。我也在网上看到了这个示例(例如,在同时调用多个RPC时)。

1 个答案:

答案 0 :(得分:6)

documented

  

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

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

通过contrast

  

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

这两种方法都不会直接在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
}

因此,实际上,CallGo的包装,它等待操作完成,而Go是基础函数,它留给调用者。 / p>

*很明显,在后台,一个goroutine涉及到某个地方,因为这是一个非阻塞操作。