生成コードリファレンス
生成コードリファレンス
gRPC Pythonは、プロトコルバッファコンパイラ(protoc)を使用してコードを生成します。プラグインを使用して、プレーンなprotocによって生成されたコードをgRPC固有のコードで補完します。gRPCサービスを含む.protoサービス記述の場合、プレーンなprotocによって生成されたコードは_pb2.pyファイルに合成され、gRPC固有のコードは_pb2_grpc.pyファイルに配置されます。後者のPythonモジュールは前者からインポートされます。このページの焦点は、生成されたコードのgRPC固有のサブセットにあります。
例
以下のFortuneTeller protoサービスを検討してください。
service FortuneTeller {
// Returns the horoscope and zodiac sign for the given month and day.
rpc TellFortune(HoroscopeRequest) returns (HoroscopeResponse) {
// errors: invalid month or day, fortune unavailable
}
// Replaces the fortune for the given zodiac sign with the provided one.
rpc SuggestFortune(SuggestionRequest) returns (SuggestionResponse) {
// errors: invalid zodiac sign
}
}
サービスがコンパイルされると、gRPC protocプラグインは、以下の_pb2_grpc.pyファイルに似たコードを生成します。
import grpc
import fortune_pb2
class FortuneTellerStub(object):
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.TellFortune = channel.unary_unary(
'/example.FortuneTeller/TellFortune',
request_serializer=fortune_pb2.HoroscopeRequest.SerializeToString,
response_deserializer=fortune_pb2.HoroscopeResponse.FromString,
)
self.SuggestFortune = channel.unary_unary(
'/example.FortuneTeller/SuggestFortune',
request_serializer=fortune_pb2.SuggestionRequest.SerializeToString,
response_deserializer=fortune_pb2.SuggestionResponse.FromString,
)
class FortuneTellerServicer(object):
def TellFortune(self, request, context):
"""Returns the horoscope and zodiac sign for the given month and day.
errors: invalid month or day, fortune unavailable
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def SuggestFortune(self, request, context):
"""Replaces the fortune for the given zodiac sign with the provided
one.
errors: invalid zodiac sign
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_FortuneTellerServicer_to_server(servicer, server):
rpc_method_handlers = {
'TellFortune': grpc.unary_unary_rpc_method_handler(
servicer.TellFortune,
request_deserializer=fortune_pb2.HoroscopeRequest.FromString,
response_serializer=fortune_pb2.HoroscopeResponse.SerializeToString,
),
'SuggestFortune': grpc.unary_unary_rpc_method_handler(
servicer.SuggestFortune,
request_deserializer=fortune_pb2.SuggestionRequest.FromString,
response_serializer=fortune_pb2.SuggestionResponse.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'example.FortuneTeller', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
コード要素
gRPCで生成されたコードは、grpcパッケージと、protocによって合成されたプレーンな_pb2モジュールをインポートすることから始まります。このモジュールは、プロトコルバッファメッセージに対応するクラスや、リフレクションで使用されるディスクリプタなど、gRPC固有ではないコード要素を定義します。
.protoファイル内の各サービスFooについて、3つの主要な要素が生成されます。
- スタブ: gRPCサービスに接続するためにクライアントが使用する
FooStub。 - サービサー: gRPCサービスを実装するためにサーバーが使用する
FooServicer。 - 登録関数:
grpc.Serverオブジェクトにサービサーを登録するために使用されるadd_FooServicer_to_server関数。
スタブ
生成されたStubクラスは、gRPCクライアントによって使用されます。これは、grpc.Channelオブジェクトを受け取り、スタブを初期化するコンストラクタを持っています。サービス内の各メソッドについて、初期化子は、スタブオブジェクトに同じ名前の対応する属性を追加します。RPCタイプ(単項またはストリーミング)に応じて、その属性の値は、UnaryUnaryMultiCallable、UnaryStreamMultiCallable、StreamUnaryMultiCallable、またはStreamStreamMultiCallable型の呼び出し可能なオブジェクトになります。
サービサー
各サービスについて、サービス実装のスーパー クラスとして機能するServicerクラスが生成されます。サービス内の各メソッドについて、Servicerクラスに対応する関数が生成されます。この関数をサービス実装でオーバーライドしてください。.protoファイル内のコード要素に関連付けられたコメントは、生成されたPythonコードのドキュメント文字列として表示されます。
登録関数
各サービスについて、実装されたServicerオブジェクトをgrpc.Serverオブジェクトに登録し、サーバーが対応するサービサーにクエリをルーティングできるようにする関数が生成されます。この関数は、Servicerを実装するオブジェクト(通常は上記で説明された生成されたServicerコード要素のサブクラスのインスタンス)と、grpc.Serverオブジェクトを受け取ります。