【发布时间】:2019-05-07 21:39:54
【问题描述】:
我刚刚开始使用 Golang 和 net/rpc 包。我试图了解您何时可以在大多数在线示例使用的 client.Call() 方法上使用异步 client.Go() 调用。会通过类似的方式异步调用 client.Call
go client.Call(...)
本质上和使用client.Go调用一样吗?我也在网上看到过这个例子(例如在同时调用多个 RPC 时)。
【问题讨论】:
我刚刚开始使用 Golang 和 net/rpc 包。我试图了解您何时可以在大多数在线示例使用的 client.Call() 方法上使用异步 client.Go() 调用。会通过类似的方式异步调用 client.Call
go client.Call(...)
本质上和使用client.Go调用一样吗?我也在网上看到过这个例子(例如在同时调用多个 RPC 时)。
【问题讨论】:
作为documented:
Go 异步调用函数。它返回表示调用的 Call 结构。 done 通道将通过返回相同的 Call 对象在调用完成时发出信号。如果 done 为 nil,Go 将分配一个新通道。如果非 nil,done 必须被缓冲,否则 Go 会故意崩溃。
这意味着它发出命令,但不等待它完成。
调用调用指定的函数,等待它完成,并返回其错误状态。
这两种方法都不会直接在 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,因为这是一个非阻塞操作。
【讨论】: