我的服务器:
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()
?
答案 0 :(得分:1)
每个http请求都有自己的goroutine,它是http.Server
本身的属性,net/rpc
构建在它之上。
来自http.Serve
的文档:
Serve接受侦听器l上的传入HTTP连接,创建 每个的新服务goroutine。服务goroutines读 请求然后调用处理程序来回复它们。处理程序通常是 nil,在这种情况下使用DefaultServeMux。
HandleHTTP在DefaultRPCPath上向DefaultServer注册RPC消息的HTTP处理程序和调试处理程序 DefaultDebugPath。仍然需要调用http.Serve(), 通常在go语句中。