python grpc
python rpc
1.1 安装和入门(Quick start)
1.下载和安装
下载包:
pip install grpcio
pip install grpcio-tools
运行examples/python/helloworld时,需要运行:
python -m grpc_tools.protoc -I../../protos --python_out=. --pyi_out=. --grpc_python_out=. ../../protos/helloworld.proto
python -m
代表将库文件当成脚本进行运行。我这里实际运行的是anaconda3/envs/grpc/lib/python3.9/site-packages/grpc_tools/protoc.py
上面的命令生成了helloworld_pb2.py和helloworld_pb2_grpc.py
2.在proto中添加方法
在proto中添加方法SayHelloAgain,并在server中实现SayHelloAgain方法,最后在client中使用server中实现的SayHelloAgain方法。
1.2 基础教程(Basics tutorial)
1.运行examples/cpp/route_guide:
进入examples/python/route_guide,运行:
python -m grpc_tools.protoc -I../../protos --python_out=. --pyi_out=. --grpc_python_out=. ../../protos/route_guide.proto
命令说明:
上面的命令生成了route_guide_pb2.py和route_guide_pb2_grpc.py,它们包含了:
- route_guide.proto文件中定义的message类
- RouteGuideStub:client能使用它进行远程调用
RouteGuideServicer:它定义了实现 RouteGuide 服务的接口
add_RouteGuideServicer_to_server:它将 RouteGuideServicer 添加到 grpc.Server
运行:
python route_guide_server.py
python route_guide_client.py # 开启另一终端
2.gRPC允许您定义四种服务方法
service中定义的参数和返回值都有可能是stream类型的,也有可能不是,这就将服务分成了四类。
stream类型就是一组相同类型的数据,如rpc ListFeatures(Rectangle) returns (stream Feature) {}
其中stream就是代表可能返回很多个Feature类型的数据,而rpc GetFeature(Point) returns (Feature) {}
只返回一个Feature类型的数据。
3.实现server
实现proto定义的service:
- 继承route_guide_pb2_grpc.py中的类
RouteGuideServicer
并重写其中的函数,即class RouteGuideServicer(route_guide_pb2_grpc.RouteGuideServicer)
。RouteGuide为proto文件中定义的service。 - 所有方法的第一个参数都是
context
代表rpc上下文。 - 使用
yield
+循环
的方式发送stream数据
使用for new_note in request_iterator:
接收stream数据
启动gRPC server:
- 创建一个server,使用
add_RouteGuideServicer_to_server
添加server - 给server设置监听端口、开启server、阻塞等待server被关闭
4.client使用server定义的接口
- 使用
grpc.insecure_channel
生成channel - 使用
route_guide_pb2_grpc.RouteGuideStub(channel)
初始化stub - 使用sub调用远程函数,调用的形式和本地调用没有什么不同。stub远程调用主要分为同步调用和异步调用:
# 同步调用
feature = stub.GetFeature(point) # 如果没有立即返回,应该会阻塞在这里
# 异步调用
feature_future = stub.GetFeature.future(point) # 如果没有立即返回,不会阻塞在这里
feature = feature_future.result() # 想要结果的时候再去取出来