我刚开始使用Golang和net / rpc软件包。我试图了解您何时可以通过client.Call()方法使用异步client.Go()调用,大多数示例都可以在线使用。将调用client。通过
之类的方式异步调用go client.Call(...)
本质上与使用client.Go呼叫相同。我也在网上看到了这个示例(例如,在同时调用多个RPC时)。
答案 0 :(得分:6)
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
}
因此,实际上,Call
是Go
的包装,它等待操作完成,而Go
是基础函数,它留给调用者。 / p>
*很明显,在后台,一个goroutine涉及到某个地方,因为这是一个非阻塞操作。