我刚刚开始使用Golang和net/rpc包.我试图了解你何时可以使用异步client.Go()调用client.Call()方法在线使用大多数示例.会通过类似的方式异步调用client.Call
go client.Call(...)
Run Code Online (Sandbox Code Playgroud)
基本上与使用client.Go电话相同?我也在网上看过这个例子(例如,在调用多个同时发送的RPC时).
作为记载:
Go异步调用该函数.它返回表示调用的Call结构.通过返回相同的Call对象,完成的通道将在呼叫完成时发出信号.如果完成为零,Go将分配一个新频道.如果非零,则必须缓冲完成,否则Go会故意崩溃.
这意味着它发出命令,但不等待它完成.
通过对比:
调用调用指定的函数,等待它完成,并返回其错误状态.
这两种方法都不直接在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
}
Run Code Online (Sandbox Code Playgroud)
所以实际上,Call是一个包装器Go,它等待操作完成,而Go底层函数则等待调用者.
*显然,在后台,某个地方涉及到goroutine,因为这是一个非阻塞操作.