首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Protocol Buffers中表示二维数组?

如何在Protocol Buffers中表示二维数组?
EN

Stack Overflow用户
提问于 2018-08-17 22:52:00
回答 2查看 3.2K关注 0票数 1

为例:

代码语言:javascript
复制
[[1,2],[3,4]...]

我只是想测试RPC是否支持二维数组,但有些问题,我正在遵循官方文档。

服务器如下:

代码语言:javascript
复制
data = [[i, 9] for i in range(128)]


class Greeter(hello_pb2_grpc.GreeterServicer):

    def SayHello(self, request, context):
        return hello_pb2.HelloReply(results=data)


def serve():

    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), options=[
                     (cygrpc.ChannelArgKey.max_send_message_length, -1),
                     (cygrpc.ChannelArgKey.max_receive_message_length, -1)
      ])
    hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    server.add_insecure_port('[::]:50052')
    server.start()
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == '__main__':
    serve()

客户端如下:

代码语言:javascript
复制
def insecure_channel(host, port):
        channel = grpc.insecure_channel(
            target=host if port is None else '%s:%d' % (host, port),
            options=[(cygrpc.ChannelArgKey.max_send_message_length, -1),
                     (cygrpc.ChannelArgKey.max_receive_message_length, -1)])
        return grpc.beta.implementations.Channel(channel)

def run():
    channel = grpc.insecure_channel('localhost:50052')
    stub = hello_pb2_grpc.GreeterStub(channel)
    st = time.time()
    response = stub.SayHello(hello_pb2.HelloRequest(name='test'))
    et = time.time() - st
    print("Greeter client received: {}, {}".format(type(response.results), et))


if __name__ == '__main__':
    run()

protobuf定义如下

代码语言:javascript
复制
syntax = "proto3";

package hello;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
    repeated Result results = 1;
}

message Result {
    repeated int32 index = 1;
    repeated int32 count = 2;
}

但我得到的错误如下:

代码语言:javascript
复制
  File "greeter_server.py", line 19, in SayHello
    return hello_pb2.HelloReply(results=data)
TypeError: Parameter to MergeFrom() must be instance of same class: expected hello.Result got list.

我正在使用python3。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-18 00:06:20

根据您的问题,[[1,2],[3,4]...]是一个数组数组。

像这样的东西应该可以解决你的问题

代码语言:javascript
复制
message InternalArray {
    repeated int internal_array = 1;
}
repeated internal_array array = 1;
票数 -1
EN

Stack Overflow用户

发布于 2019-01-10 18:30:16

问题是你在期望hello.Result的地方传递了一个列表。

使用:

代码语言:javascript
复制
    import hello_pb2
    to_return = hello_pb2.Result()
    to_return.index = 111
    to_return.count = 222

现在从rpc调用返回to\_return

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51897957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档