gRPC python

$ pip install grpcio
$ pip install grpcio-tools
$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. calculator.proto

$ python -m grpc_tools.protoc -I./proto/ --python_out=./proto/ --grpc_python_out=./proto/ ./proto/calculator.proto

srv/app.py

import grpc
from concurrent import futures
import time

# import the generated classes
import proto.calculator_pb2 as pb2
import proto.calculator_pb2_grpc as pb2_grpc

# import the original calculator.py
import srv.calculator as calculator

# create a class to define the server functions, derived from
# calculator_pb2_grpc.CalculatorServicer
class CalculatorServicer(pb2_grpc.CalculatorServicer):

    # calculator.square_root is exposed here
    # the request and response are of the data type
    # calculator_pb2.Number
    def SquareRoot(self, request, context):
        response = pb2.Number()
        response.value = calculator.square_root(request.value)
        return response


# create a gRPC server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))

# use the generated function `add_CalculatorServicer_to_server`
# to add the defined class to the server
pb2_grpc.add_CalculatorServicer_to_server(
    CalculatorServicer(), 
    server
)

# listen on port 50051
print('Starting server. Listening on port 50051.')
server.add_insecure_port('[::]:50051')
server.start()

# since server.start() will not block,
# a sleep-loop is added to keep alive
try:
    while True:
        time.sleep(2)
except KeyboardInterrupt:
    server.stop(0)

cli/app.py

Last updated