从GRPC Python服务器发回文件流

时间:2018-09-06 05:55:42

标签: python grpc grpc-python

我有一项服务,需要将文件流返回给调用方客户端,因此我已经创建了此原始文件。

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

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

2 个答案:

答案 0 :(得分:1)

这似乎大部分都是正确的,但是由于您尚未与我们共享所有服务端代码,因此很难确定。我建议您进行以下调整:(1)首先将文件读取为二进制内容;(2)尽早退出with语句;(3)仅在ve构造了其data字段的值,并且(4)使文件名之外的模块作用域模块专用常量成为常数。像这样:

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

。你觉得呢?

答案 1 :(得分: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)

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