クイックスタート
このガイドでは、簡単な実行例を使って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ディレクトリから
サーバーを実行する
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
次は何をするか
- gRPCの仕組みをgRPCの紹介とコアコンセプトで学習してください。
- 「基本チュートリアル」を完了してください。
- APIリファレンス(APIリファレンス)を探索してください。