从 GRPC Python 服务器发回文件流

Sending back a file stream from GRPC Python Server

我有一项服务需要 return 一个文件流到调用客户端,所以我创建了这个原型文件。

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

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

这看起来大部分是正确的,但很难确定,因为您没有与我们分享您所有的服务端代码。我建议的一些调整是(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)

。你怎么看?

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

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)

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