Отправка обратно файлового потока с GRPC Python Server - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть служба, которая должна возвращать поток файлов вызывающему клиенту, поэтому я создал этот файл прото.

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 голосов
/ 06 марта 2019

Одним из вариантов будет ленивое чтение в двоичном коде и выдача каждого куска. Обратите внимание, это непроверенный код:

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)

Недостатком является то, что файл будет открыт, пока открыт поток.

0 голосов
/ 23 сентября 2018

Это выглядит в основном правильно, хотя трудно быть уверенным, так как вы не поделились с нами всем своим кодом сервисной стороны. Я бы посоветовал несколько хитростей: (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)

. Что ты думаешь?

...