クイックスタート
このガイドでは、簡単な動作例を使用して、PythonでのgRPCの使用方法を説明します。
クイックスタート
前提条件
- Python 3.7以降
pip
バージョン9.0.1以降
必要に応じて、pip
のバージョンをアップグレードしてください。
$ python -m pip install --upgrade pip
システム所有のインストールのためにpip
をアップグレードできない場合は、virtualenvでサンプルを実行できます。
$ 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.62.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
ディレクトリから
サーバーを実行します
$ python greeter_server.py
別のターミナルから、クライアントを実行します
$ 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
ディレクトリから
サーバーを実行します
$ python greeter_server.py
別のターミナルから、クライアントを実行します
$ python greeter_client.py