登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  Golang >  Go问答

net/rpc 为 Go 语言中 .Call 和 .Go 方法的区别是什么?

来源:stackoverflow

时间:2024-03-03 17:06:26 250浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《net/rpc 为 Go 语言中 .Call 和 .Go 方法的区别是什么?》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我刚刚开始使用 golang 和 net/rpc 包。我试图了解什么时候可以使用异步 client.go() 调用而不是大多数在线示例使用的 client.call() 方法。会通过类似

的方式异步调用 client.call
go client.Call(...)

本质上与使用 client.go 调用相同?我也在网上看到过这个例子(例如调用多个并发 rpc 时)。


解决方案


如documented:

go 异步调用该函数。它返回表示调用的 call 结构。当调用完成时,done 通道将通过返回相同的 call 对象发出信号。如果done为nil,go将分配一个新的通道。如果非 nil,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 是底层函数,它将等待留给调用者。

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

今天关于《net/rpc 为 Go 语言中 .Call 和 .Go 方法的区别是什么?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>