3

我有一项服务需要将文件流返回给调用客户端,所以我创建了这个 proto 文件。

service Sample {
     rpc getSomething(Request) returns (stream Response){}
}

message Request {

}

message Response {
    bytes data = 1;
}

当服务器接收到这个时,它需要读取一些 source.txt 文件,然后将其作为字节流写回客户端。只是想问一下这是在 Python GRPC 服务器中执行此操作的正确方法吗?

fileName = "source.txt"
with open(file_name, 'r') as content_file:
    content = content_file.read()
    response.data = content.encode()
    yield response

我找不到与此相关的任何示例。

4

2 回答 2

5

这看起来大部分是正确的,但很难确定,因为您还没有与我们共享您的所有服务端代码。我建议的一些调整是(1)首先将文件作为二进制内容读取,(2)with尽早退出语句,(3)仅在构造值之后构造响应消息它的data字段,以及 (4) 从文件名中创建一个模块范围的模块私有常量。就像是:

with open(_CONTENT_FILE_NAME, 'rb') as content_file:
    content = content_file.read()
yield my_generated_module_pb2.Response(data=content)

. 你怎么看?

于 2018-09-23T02:20:27.717 回答
0

一种选择是懒惰地读取二进制文件并产生每个块。请注意,这是未经测试的代码:

def read_bytes(file_, num_bytes):
    while True:
        bin = file_.read(num_bytes)
        if len(bin) != num_bytes:
            break
        yield bin   

class ResponseStreamer(Sample_pb2_grpc.SampleServicer):
    def getSomething(request, context):
        with open('test.bin', 'rb') as f:
            for rec in read_bytes(f, 4):
                yield Sample_pb2.Response(data=rec)

缺点是您将在流打开时打开文件。

于 2019-03-06T18:10:13.523 回答