python gRPC 简单示例

  • Post author:
  • Post category:python






转载自:

https://blog.csdn.net/ctwy291314/article/details/91866261

修改了部分代码

Ubuntu18.04安装gRPC

  • protobuf-compiler-grpc安装


    sudo apt-get install protobuf-compiler-grpc
  • protobuf-compiler安装


    sudo apt-get install protobuf-compiler
  • gRPC 的安装


    pip install grpcio
  • 安装 ProtoBuf 相关的 python 依赖库


    pip install protobuf
  • 安装 python grpc 的 protobuf 编译工具


    pip install grpcio-tools





编写示例工程

  • 工程结构

    在这里插入图片描述
  • 编写 proto 文件

    在工程下新建

    stream

    目录,新建

    stream.proto

    文件,文件可名称任意

    syntax = "proto3";
    package stream;
    service StreamService {
      rpc SimpleFun(RequestData) returns (ResponseData){}
    }
    message RequestData {
      string text = 1;
      int32 name = 2; #参数增加数字增加
    }
    
    message ResponseData {
      string text = 1;
    }
    
  • 编译 protobuf

    切换至

    stream

    目录,执行以下命令:


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



stream

目录中执行编译,会生成:

stream_pb2.py



stream_pb2_grpc.py

,需修正

stream_pb2_grpc.py

的引用

stream__pb2

的路径

  • 实现 server 端,

    simple_server.py

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    import grpc
    import time
    from concurrent import futures
    from stream import stream_pb2, stream_pb2_grpc
    
    _ONE_DAY_IN_SECONDS = 60 * 60 * 24
    _HOST = 'localhost'
    _PORT = '8883'
    
    
    class servicer(stream_pb2_grpc.StreamServiceServicer):
    
        def SimpleFun(self, request, context):
            strcontent = request.text
            print("received: " + strcontent)
            print("received: " + str(request.name))
            print("Call SimpleFun End")
            return stream_pb2.ResponseData(text=('hello,gRPC'))
    
    
    def serve():
        grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
        stream_pb2_grpc.add_StreamServiceServicer_to_server(servicer(), grpcServer)
        grpcServer.add_insecure_port(_HOST + ':' + _PORT)
        grpcServer.start()
        try:
            while True:
                time.sleep(_ONE_DAY_IN_SECONDS)
        except KeyboardInterrupt:
            grpcServer.stop(0)
    
    
    if __name__ == '__main__':
        serve()
    
  • 实现 client端,

    simple_client.py

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    import grpc
    from stream import stream_pb2, stream_pb2_grpc
    
    _HOST = 'localhost'
    _PORT = '8883'
    
    def run():
        conn = grpc.insecure_channel(_HOST + ':' + _PORT)
        client = stream_pb2_grpc.StreamServiceStub(channel=conn)
        response = client.SimpleFun(stream_pb2.RequestData(text='hello,world!', name = 0))
        print("received: " + response.text)
    
    if __name__ == '__main__':
        run()
    
  • 执行结果

    先启动

    simple_server.py

    再启动

    simple_client.py


    在这里插入图片描述
    在这里插入图片描述