Grpc 不增加消息的最大大小:收到的消息大于最大值

MUA*_*UAS 6 python grpc grpc-python

我正在使用 grpc 发送一些非常大的消息(网络上机器学习模型的参数)。问题是当我进行 grpc 调用时出现以下错误:

grpc: received message larger than max (261268499 vs. 4194304)
Run Code Online (Sandbox Code Playgroud)

正如其他帖子中所建议的,我尝试增加通道和 grpc 服务器上的最大消息大小,但我一直收到相同的错误。关于如何让它发挥作用的任何想法?

我的服务器代码:

maxMsgLength = 1024 * 1024 * 1024
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10),
                     options=[('grpc.max_message_length', maxMsgLength),
                              ('grpc.max_send_message_length', maxMsgLength),
                              ('grpc.max_receive_message_length', maxMsgLength)])
Run Code Online (Sandbox Code Playgroud)

客户端:

maxMsgLength = 1024 * 1024 * 1024
channel = grpc.insecure_channel(ip_port, 
                                options=[('grpc.max_message_length', maxMsgLength),
                                         ('grpc.max_send_message_length', maxMsgLength),
                                         ('grpc.max_receive_message_length', maxMsgLength)])
Run Code Online (Sandbox Code Playgroud)

编辑:

不是解决方案,但也许可以更深入地了解问题。出于某种原因,如果我将最大消息大小设置为 1024 * 1024 * 1024,它最终会默认为 4194304,正如错误消息所暗示的那样。不太确定为什么会这样。但无论如何,我尝试将最大消息大小减小到 1024 * 1024 * 200,它在错误消息 (209715200) 中显示了正确的最大消息大小。似乎存在 grpc 未正确设置最大消息大小的问题。不知道如何解决这个问题。

在错误消息显示正确最大值的情况下,我可以使用的最大数量是 2^28。如果我将最大消息大小设置为 2^29,则默认为 4194304。

Pan*_*ini 0

您可以使用 grpc Streaming API 以块的形式发送数据,如下例所示。不过,为了更好地明确您的确切要求,需要更多详细信息。

原始缓冲区文件

syntax = "proto3";

package pb.foo_service;

service FooService {
    rpc TestRpc(TestRequest) returns (stream TestResponse) {}
}

message TestRequest {}

message TestResponse {
  bytes data = 1;
}
Run Code Online (Sandbox Code Playgroud)

服务商

class FooService(pb_grpc.FooServiceServicer):

    def TestRpc(
        self,
        request: pb.TestRequest,
        context: grpc.ServicerContext
    ) -> Iterator[pb.TestResponse]:
        with open("test_file", 'rb') as content_file:
            content = content_file.read()
    yield my_generated_module_pb2.Response(data=content)
Run Code Online (Sandbox Code Playgroud)