生成コードリファレンス

生成コードリファレンス

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タイプ(単項またはストリーミング)に応じて、その属性の値は、UnaryUnaryMultiCallableUnaryStreamMultiCallableStreamUnaryMultiCallable、またはStreamStreamMultiCallable型の呼び出し可能なオブジェクトになります。

サービサー

各サービスについて、サービス実装のスーパー クラスとして機能するServicerクラスが生成されます。サービス内の各メソッドについて、Servicerクラスに対応する関数が生成されます。この関数をサービス実装でオーバーライドしてください。.protoファイル内のコード要素に関連付けられたコメントは、生成されたPythonコードのドキュメント文字列として表示されます。

登録関数

各サービスについて、実装されたServicerオブジェクトをgrpc.Serverオブジェクトに登録し、サーバーが対応するサービサーにクエリをルーティングできるようにする関数が生成されます。この関数は、Servicerを実装するオブジェクト(通常は上記で説明された生成されたServicerコード要素のサブクラスのインスタンス)と、grpc.Serverオブジェクトを受け取ります。