假设我需要从服务器发送到客户端的消息是这样的:
message BatchReply {
bytes data = 1;
repeated int32 shape = 2;
string dtype = 3;
repeated int64 labels = 4;
}
这里shape
/ dtype
只是小变量,可以用几个整数空间表示,而data
/ labels
是大内存缓冲区,最多可以占用1G内存。
我正在尝试通过流发送此消息:
service ImageService {
rpc get_batch (BatchRequest) returns (stream BatchReply) {}
}
我的问题是,我可以找到通过流发送消息的示例都是关于消息结构中只有一个字段的消息,例如:
service TransferFile {
rpc Upload(stream Chunk) returns (Reply) {}
}
message Chunk {
bytes buffer = 1; // here is only on field of buffer, what if there is a field of int val = 2; ?
}
如果Chunk
的结构中有两个字段,该怎么办。在相同的流馈送过程中,每次调用set_val()
时是否都需要调用set_buffer()
?
您可以通过grpc发送带有多个字段的消息。这就是使用protobuf的优势。
我不知道您使用的传输层是否能够处理您指定的大消息。您可以测试一下。如果这不起作用,则可以使用您提供的TransferFile
示例。
[查看Chunk
时,我得到的印象是他们正在发送全部数据的片段。另一方面,他们然后将这些段重构为完整的集合。用于Chunk
的类型是字节。这些只是原始字节,可以代表您想要的任何内容。
要分批发送BatchReply
,可以使用以下步骤:
BatchReply
对象中设置数据。Chunk
对象中设置字节数组的一部分。例如,每次100个字节。Chunk
接口发送TransferFile
对象。在接收端,将块连接到一个数组中,然后将该数组反序列化为BatchReply
对象。