クイックスタート

このガイドでは、簡単な実行例を使ってPythonでgRPCを始める方法を説明します。

クイックスタート

このガイドでは、簡単な実行例を使ってPythonでgRPCを始める方法を説明します。

前提条件

  • Python 3.7以降
  • pipバージョン9.0.1以降

必要に応じてpipのバージョンをアップグレードしてください

python -m pip install --upgrade pip

システムで管理されているインストールによりpipをアップグレードできない場合は、仮想環境で例を実行できます

python -m pip install virtualenv
virtualenv venv
source venv/bin/activate
python -m pip install --upgrade pip

gRPC

gRPCのインストール

python -m pip install grpcio

または、システム全体にインストールするには

sudo python -m pip install grpcio

gRPCツール

PythonのgRPCツールには、プロトコルバッファコンパイラprotocと、.protoサービス定義からサーバーおよびクライアントコードを生成するための特別なプラグインが含まれています。クイックスタート例の最初の部分では、helloworld.protoからサーバーとクライアントのスタブを既に生成していますが、残りのクイックスタート、および後続のチュートリアルや独自のプロジェクトではこれらのツールが必要になります。

gRPCツールをインストールするには、次を実行します。

python -m pip install grpcio-tools

サンプルをダウンロードする

このクイックスタートを進めるには、サンプルコードのローカルコピーが必要です。GitHub リポジトリからサンプルコードをダウンロードしてください(以下のコマンドはリポジトリ全体をクローンしますが、このクイックスタートや他のチュートリアルには例のみが必要です)。

# Clone the repository to get the example code:
git clone -b v1.74.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
# Navigate to the "hello, world" Python example:
cd grpc/examples/python/helloworld

gRPCアプリケーションを実行する

examples/python/helloworldディレクトリから

  1. サーバーを実行する

    python greeter_server.py
    
  2. 別のターミナルで、クライアントを実行する

    python greeter_client.py
    

おめでとうございます!gRPCを使用したクライアント・サーバーアプリケーションを実行できました。

gRPCサービスを更新する

次に、クライアントが呼び出すための追加メソッドをサーバーに実装するようにアプリケーションを更新する方法を見てみましょう。gRPCサービスはプロトコルバッファを使用して定義されています。サービスを.protoファイルで定義する方法については、gRPCの紹介基本チュートリアルで詳しく説明しています。今のところ、サーバーとクライアントの「スタブ」の両方に、クライアントからHelloRequestパラメータを受け取り、サーバーからHelloReplyを返すSayHello RPCメソッドがあり、このメソッドは次のように定義されていることを知っておくだけで十分です。

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

これを更新して、`Greeter` サービスが 2 つのメソッドを持つようにしましょう。`examples/protos/helloworld.proto` を編集し、同じリクエストとレスポンスタイプを持つ新しい `SayHelloAgain` メソッドを追加してください。

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

ファイルを保存してください!

gRPCコードの生成

次に、新しいサービス定義を使用するように、アプリケーションで使用するgRPCコードを更新する必要があります。

examples/python/helloworldディレクトリから、次を実行します。

python -m grpc_tools.protoc -I../../protos --python_out=. --pyi_out=. --grpc_python_out=. ../../protos/helloworld.proto

これにより、生成されたリクエストおよびレスポンスクラスを含むhelloworld_pb2.pyと、生成されたクライアントおよびサーバークラスを含むhelloworld_pb2_grpc.pyが再生成されます。

アプリケーションの更新と実行

これで、新しく生成されたサーバーとクライアントのコードができました。しかし、例のアプリケーションの手書き部分に新しいメソッドを実装して呼び出す必要があります。

サーバーを更新する

同じディレクトリでgreeter_server.pyを開きます。新しいメソッドを次のように実装します。

class Greeter(helloworld_pb2_grpc.GreeterServicer):

    def SayHello(self, request, context):
        return helloworld_pb2.HelloReply(message=f"Hello, {request.name}!")

    def SayHelloAgain(self, request, context):
        return helloworld_pb2.HelloReply(message=f"Hello again, {request.name}!")
...

クライアントを更新する

同じディレクトリでgreeter_client.pyを開きます。新しいメソッドを次のように呼び出します。

def run():
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
        print("Greeter client received: " + response.message)
        response = stub.SayHelloAgain(helloworld_pb2.HelloRequest(name='you'))
        print("Greeter client received: " + response.message)

実行!

前述と同様に、examples/python/helloworldディレクトリから

  1. サーバーを実行する

    python greeter_server.py
    
  2. 別のターミナルで、クライアントを実行する

    python greeter_client.py
    

次は何をするか