Python gRPC使用

参考文档

Python版gRPC入门实验(zhihu.com)

环境准备

下载依赖库#

pip install grpcio
pip install grpcio-tools

创建文件夹#

创建一个文件夹 project

自定义 gRPC 接口

编写一个名为 receiver.proto 文件#

目录 project/receiver.proto

syntax = "proto3";
import "google/protobuf/struct.proto";

// 服务定义 service 关键字
service Receiver {
  rpc receive (Event) returns (Reply) {}
}

// 接收消息定义 message 
message Event {    # 可以换成直观的 message Request
  string appid = 1;
  int32 xwhen = 2;
  string xwho = 3;
  string xwhat = 4;
  google.protobuf.Struct xcontext = 5;
}

// 返回消息定义 message 
message Reply {    # message Response
  int32 status = 1;
  string message = 2;
}

编译 proto 文件生成服务接口

编译命令#

在 project/ 目录下执行

python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. receiver.proto

生成以下两个文件#

receiver_pb2.py
receiver_pb2_grpc.py

编写代码

project/server.py#

# _*_ coding: utf-8 _*_

import grpc
import receiver_pb2
import receiver_pb2_grpc

import time
from concurrent import futures

_ONE_DAY_IN_SECONDS = 60 * 60 * 24


class Receiver(receiver_pb2_grpc.ReceiverServicer):

    # 重写父类方法,返回消息
    def receive(self, request, context):
        print('request:', request)
        print(type(request))
        return receiver_pb2.Reply(message='Hello, %s!' % request.xwho)


if __name__ == '__main__':
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    receiver_pb2_grpc.add_ReceiverServicer_to_server(Receiver(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    print('server start...')
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)

project/client.py#

# _*_ coding: utf-8 _*_

import grpc
import receiver_pb2
import receiver_pb2_grpc

import time
from concurrent import futures

_ONE_DAY_IN_SECONDS = 60 * 60 * 24


class Receiver(receiver_pb2_grpc.ReceiverServicer):

    # 重写父类方法,返回消息
    def receive(self, request, context):
        print('request:', request)
        print(type(request))
        return receiver_pb2.Reply(message='Hello, %s!' % request.xwho)


if __name__ == '__main__':
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    receiver_pb2_grpc.add_ReceiverServicer_to_server(Receiver(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    print('server start...')
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)

执行结果

Server 端#

request: appid: "fuckgod"
xwhen: 123
xwho: "jerry"
xwhat: "install"
xcontext {
  fields {
    key: "amount"
    value {
      number_value: 123.0
    }
  }
  fields {
    key: "idfa"
    value {
      string_value: "idfa1"
    }
  }
}

取值方式#

# 解析 request 中的数据 (以上的数据)

# 获取 gRPC 自定义接口中的数据
appid = request.appid
xwhen = request.xwhen
xwhat = request.xwhat
xwho = request.xwho

# 取出 xcontext 中的数据
xcontent = request.xcontent


# 取出 xcconten 中的所有 fields 数据
""" fields 数据
{
   'idfa': string_value: "idfa1"
   'amount': number_value: 123.0
}
"""
fields = xcontent.fields

# 取出 iafa 的值
idfa = fields['idfa'].string_value

# 取出 amount 的值
amount = fields['amount'].number_value

取值总结#

什么时候用 . 取值?什么时候用 ['key‘] 取值?

打印 request 的数据中,没有引号的用 . 取值,带双引号的用 [‘key’] 取值

Client 端#

client status: 0 received: Hello, jerry!
posted @   隔江千万里  阅读(363)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
主题色彩