生成コードリファレンス
生成コードリファレンス
gRPC Pythonは、プロトコルバッファコンパイラ(protoc
)を使用してコードを生成します。プレーンなprotoc
で生成されたコードをgRPC固有のコードで補完するためにプラグインを使用します。gRPCサービスを含む.proto
サービス記述の場合、プレーンなprotoc
で生成されたコードは_pb2.py
ファイルに合成され、gRPC固有のコードは_pb2_grpc.py
ファイルに配置されます。後者のPythonモジュールは前者をインポートします。このページでは、生成されたコードのgRPC固有の部分に焦点を当てます。
例
以下のFortuneTeller
プロトサービスを検討してください。
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
パッケージと、プロトコルバッファメッセージに対応するクラスやリフレクションで使用される記述子など、gRPCに固有ではないコード要素を定義するプレーンな_pb2
モジュール(protoc
によって合成される)をインポートすることから始まります。
.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コードのdocstringとして表示されます。
登録関数
各サービスについて、サーバーがクエリをそれぞれのサービサーにルーティングできるように、それを実装するServicer
オブジェクトをgrpc.Server
オブジェクトに登録する関数が生成されます。この関数は、上記で説明した生成されたServicer
コード要素のサブクラスのインスタンスであるのが一般的ですが、Servicer
を実装するオブジェクトとgrpc.Serverオブジェクトを受け取ります。