rpc Call方法是否在与服务器相同的go例程中运行?

时间:2016-05-04 13:20:33

标签: go rpc

我的服务器:

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会在另一个例程中运行吗? client.Call()实际上会调用go server.SomeFun()

1 个答案:

答案 0 :(得分:1)

每个http请求都有自己的goroutine,它是http.Server本身的属性,net/rpc构建在它之上。

来自http.Serve的文档:

  

Serve接受侦听器l上的传入HTTP连接,创建   每个的新服务goroutine。服务goroutines读   请求然后调用处理程序来回复它们。处理程序通常是   nil,在这种情况下使用DefaultServeMux。

来自rpc.HandleHTTP

  

HandleHTTP在DefaultRPCPath上向DefaultServer注册RPC消息的HTTP处理程序和调试处理程序   DefaultDebugPath。仍然需要调用http.Serve(),   通常在go语句中。