2016-05-04 10 views
0

マイサーバー: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

各HTTPリクエストには、http.Serverのプロパティである独自のゴルーチンがあり、その上にnet/rpcというビルドがあります。 http.Serveのドキュメントから

サーブは 各ための新しいサービスゴルーチンを作成、リスナーリットルの着信HTTP接続を受け付けます。サービスゴルーチンは 要求を読み取り、ハンドラを呼び出して応答します。ハンドラは通常 nilです。この場合、DefaultServeMuxが使用されます。

そしてrpc.HandleHTTPから:

HandleHTTPはDefaultRPCPath上のdefaultserverへのRPCメッセージのHTTPハンドラと DefaultDebugPathのデバッグハンドラを登録します。通常、goステートメントでhttp.Serve()、 を呼び出す必要があります。

+0

RPCはまたHTTP要求の一種ですか? – Pao

+0

@haoyuanはい、httpで配信されます。 – OneOfOne

関連する問題