rpc Call 方法是不是与服务器在同一个 go 例程中运行?
Posted
技术标签:
【中文标题】rpc Call 方法是不是与服务器在同一个 go 例程中运行?【英文标题】:Does rpc Call method run in the same go routine as the server?rpc Call 方法是否与服务器在同一个 go 例程中运行? 【发布时间】:2016-05-04 13:20:32 【问题描述】:我的服务器:
func (t *Arith) Multiply(args *Args, reply *int) error
*reply = args.A * args.B
return nil
func main()
arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234")
if e != nil
log.Fatal("listen error:", e)
go http.Serve(l, nil)
客户:
client.Call("Arith.Multiply", args, &reply)
我想然后Multiply
在另一个 go 例程中运行? client.Call()
实际上调用了go server.SomeFun()
?
【问题讨论】:
【参考方案1】:每个 http 请求都有自己的 goroutine,这是 http.Server
本身的属性,net/rpc
建立在它之上。
来自http.Serve
的文档:
Serve 在侦听器 l 上接受传入的 HTTP 连接,创建 每个都有一个新的服务goroutine。服务 goroutine 读取 请求,然后调用处理程序来回复它们。处理程序通常是 nil,在这种情况下使用 DefaultServeMux。
来自rpc.HandleHTTP
:
HandleHTTP 在 DefaultRPCPath 上为 DefaultServer 注册 RPC 消息的 HTTP 处理程序,并在 DefaultRPCPath 上注册一个调试处理程序 DefaultDebugPath.还是需要调用http.Serve(), 通常在 go 语句中。
【讨论】:
RPC也是一种http请求? @haoyuan 是的,它是通过 http 提供的。以上是关于rpc Call 方法是不是与服务器在同一个 go 例程中运行?的主要内容,如果未能解决你的问题,请参考以下文章
codis3.2安装报错dashboard.go:369: [PANIC] call rpc create-proxy to dashboard 127.0.0.1:18080 failed的处理(代