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()              # 想要结果的时候再去取出来 
posted @ 2022-11-25 22:48  好人~  阅读(281)  评论(0编辑  收藏  举报