我刚刚开始使用 Golang 和 net/rpc 包。我试图了解您何时可以使用异步 client.Go() 调用大多数在线示例使用的 client.Call() 方法。会通过类似的方式异步调用 client.Callgo client.Call(...)本质上和使用 client.Go 调用是一样的吗?我也在网上看到过这个例子(例如当同时调用多个 RPC 时)。
1 回答
函数式编程
TA贡献1807条经验 获得超9个赞
记录在案:
Go 异步调用该函数。它返回表示调用的 Call 结构。done 通道将在调用完成时通过返回相同的 Call 对象发出信号。如果 done 为 nil,Go 将分配一个新频道。如果非零,则 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
}
所以实际上,Call是一个包装器Go,它等待操作完成,而Go是底层函数,等待调用者。
*显然,在后台某处涉及一个goroutine,因为这是一个非阻塞操作。
- 1 回答
- 0 关注
- 132 浏览
添加回答
举报
0/150
提交
取消