我有一项服务,需要将文件流返回给调用方客户端,因此我已经创建了此原始文件。
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
我找不到与此相关的任何示例。
答案 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)
缺点是流打开时将打开文件。