【问题标题】:What is the difference between net/rpc .Call vs .Go?net/rpc .Call 与 .Go 有什么区别?
【发布时间】:2019-05-07 21:39:54
【问题描述】:

我刚刚开始使用 Golang 和 net/rpc 包。我试图了解您何时可以在大多数在线示例使用的 client.Call() 方法上使用异步 client.Go() 调用。会通过类似的方式异步调用 client.Call

go client.Call(...)

本质上和使用client.Go调用一样吗?我也在网上看到过这个例子(例如在同时调用多个 RPC 时)。

【问题讨论】:

    标签: go rpc


    【解决方案1】:

    作为documented:

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

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

    contrast:

    调用调用指定的函数,等待它完成,并返回其错误状态。

    这两种方法都不会直接在 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 是底层函数,它让调用者等待。

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

    【讨论】:

      猜你喜欢
      • 2020-03-05
      • 2020-10-11
      • 2018-02-18
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2010-09-09
      相关资源
      最近更新 更多