читать из async.subprocess.PIPE - PullRequest
0 голосов
/ 12 июня 2018
return asyncio.create_subprocess_exec(*_cmd, stdout=asyncio.subprocess.PIPE, limit=2 ** 32, stderr=asyncio.subprocess.PIPE, loop=loop)

Я использую этот код для создания асинхронного подпроцесса, затем получаю сообщение от stdout.

data = await  p.stdout.read(n=height * width * 3)

EveryThing хорошо, я читаю из pipe 2k jpg 2 fps by Байт изображенияразмер - 11059200, но максимальный размер при чтении - всегда 8192, поэтому я пытаюсь получить его один раз.

print("start1" + str(arrow.now()))
loop_size = int(height * width * 3 / 8192 + 1)
print(loop_size)
list = [await  p.stdout.read(n=height * width * 3) for _ in range(loop_size)]
print("start2" + str(arrow.now()))
data = b"".join(list)
print("end" + str(arrow.now()))

Кажется, все в порядке.

start22018-06-12T19: 44: 30.902742 + 08: 00
end2018-06-12T19: 44: 30.909693 + 08: 00
2018-06-12T19: 44: 30.916675 + 08: 00

Если канал представляет собой большой файл преобразования, процесс не сможет сразу обработать данные, поэтому программа всегда прерывается.

Я хочу знать, почему пакет, полученный из канала, является awlay 8192, Можно ли читать какобычный Subprocess.Pipe.read (bufsize = width * height * 3)?Любое хорошее предложение для этого вопроса?

изображение

1 Ответ

0 голосов
/ 12 июня 2018

Размер байта изображения равен 11059200, но максимальный размер, когда я читаю, всегда равен 8192

StreamReader.read, считывается не более указанного количества байтов,но может возвращать меньше байтов, сколько возвращает базовый системный вызов.Обычно это особенность, потому что она позволяет вам обрабатывать данные по мере их поступления, в то же время применяя верхнюю границу количества данных, хранящихся в памяти одновременно.

В вашем коде вы хотите подождать, покавсе изображение готово, что можно сделать, позвонив readexactly вместо read:

data = await p.stdout.readexactly(height * width * 3)
...