This guide provides a simple practical example of using gRPC in Python to create a basic server and client for a “Hello, World!” operation.
Make sure you have gRPC installed. You can install it using pip:
pip install grpcio pip install grpcio-tools
Create a file named `hello.proto` with the following content:
syntax = "proto3"; service HelloService { rpc SayHello (HelloRequest) returns (HelloResponse); } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; }
Run the following commands to generate the Python files from the protobuf file:
python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. hello.proto
This will generate `hello_pb2.py` and `hello_pb2_grpc.py`.
In this step, you will create a Python script named `server.py` to implement the gRPC server. Follow these detailed instructions to understand each component:
Step 4.1 to Step 4.4: Define a class `HelloServicer` that inherits from the generated `HelloServiceServicer` class. Implement the `SayHello` method to handle the “Hello, World!” operation.
Step 4.5 to Step 4.10: Define a function `serve` to set up and start the gRPC server. This includes creating a server, adding the servicer implementation, specifying a port, and starting the server.
Step 4.11 to Step 4.12: Check if the script is being run directly and call the `serve` function to start the server.
import grpc from concurrent import futures import hello_pb2 import hello_pb2_grpc # Step 4.1: Define a class that inherits from the generated servicer base class class HelloServicer(hello_pb2_grpc.HelloServiceServicer): # Step 4.2: Implement the service method defined in the proto file def SayHello(self, request, context): # Step 4.3: Create a response object and set the message response = hello_pb2.HelloResponse() response.message = f"Hello, {request.name}!" # Step 4.4: Return the response return response # Step 4.5: Define a function to start the gRPC server def serve(): # Step 4.6: Create a gRPC server with a thread pool for handling requests server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) # Step 4.7: Add the servicer implementation to the server hello_pb2_grpc.add_HelloServiceServicer_to_server(HelloServicer(), server) # Step 4.8: Add an insecure port to the server (you should use a secure port in production) server.add_insecure_port('[::]:50051') # Step 4.9: Start the server server.start() print("Server running on port 50051") # Step 4.10: Wait for the server to be terminated server.wait_for_termination() # Step 4.11: Check if the script is being run directly if __name__ == '__main__': # Step 4.12: Call the serve function to start the server serve()
Create a file named `client.py` with the following content:
import grpc import hello_pb2 import hello_pb2_grpc def run(): channel = grpc.insecure_channel('localhost:50051') stub = hello_pb2_grpc.HelloServiceStub(channel) response = stub.SayHello(hello_pb2.HelloRequest(name='World')) print("Client received: " + response.message) if __name__ == '__main__': run()
In one terminal, run the server:
python server.py
In another terminal, run the client:
python client.py
You should see the output:
Client received: Hello, World!