python 使用grpc 的方法
需要的依赖包
grpcio googleapis-common-protos
首先需要根据proto 文件生成代码
proto 示例代码
syntax = "proto3"; service MsgService { rpc GetMsg (MsgRequest) returns (MsgResponse){} } message MsgRequest { string name = 1; } message MsgResponse { string msg = 1; }
根据proto 生成py代码
python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. msg.proto
server 端代码示例
import grpc from grpc_demo import msg_pb2 from grpc_demo import msg_pb2_grpc from concurrent import futures import time _ONE_DAY_IN_SECONDS = 60 * 60 * 24 class MsgServicer(msg_pb2_grpc.MsgServiceServicer): def GetMsg(self, request, context): print("Received name: %s" % request.name) return msg_pb2.MsgResponse(msg='Hello, %s!' % request.name) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) msg_pb2_grpc.add_MsgServiceServicer_to_server(MsgServicer(), server) server.add_insecure_port('[::]:50051') server.start() try: while True: time.sleep(_ONE_DAY_IN_SECONDS) except KeyboardInterrupt: server.stop(0) if __name__ == '__main__': serve()
客户端代码示例
import grpc from grpc_demo import msg_pb2, msg_pb2_grpc _HOST = 'localhost' _PORT = '8080' def run(): # NOTE(gRPC Python Team): .close() is possible on a channel and should be # used in circumstances in which the with statement does not fit the needs # of the code. with grpc.insecure_channel('localhost:50051') as channel: stub = msg_pb2_grpc.MsgServiceStub(channel) response = stub.GetMsg(msg_pb2.MsgRequest(name='world')) print("Client received: " + response.msg) if __name__ == '__main__': run()
proto 中 repeated 对象的属性是列表
py接收到数据的时候需要遍历获取内容
请求的参数中某个某个字段如下
google.protobuf.Timestamp after = 3;
时间类型的数据转换
from google.protobuf.timestamp_pb2 import Timestamp after = "000-00-00T00:00:00" befer = "000-00-00T00:00:00" timestamp_message_after = Timestamp() timestamp_message_befer = Timestamp() timestamp_message_after.FromJsonString(after) timestamp_message_befer.FromJsonString(befer)