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。
您可以使用 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)