Эффективно читать все доступные байты из двоичного потока в Python (например, C ++ readsome) - PullRequest
0 голосов
/ 05 мая 2019

У меня есть символьное устройство, которое обычно доставляет несколько мегабайт в секунду двоичных данных.Однако устройство может сообщить об ошибке всего несколькими байтами.Кроме того, поток может зависнуть на неопределенное время - это не ошибка.Формат двоичных данных проприетарный, и я не могу его проанализировать.Мое клеевое приложение написано на Python 3, и мне нужно передать данные.

В настоящее время я использую модуль select для проверки доступных данных перед чтением:

keep_running = True
while keep_running:
    chunk = b''
    if (input_stream in select.select([input_stream], [], [], 1)[0]):
        chunk = input_stream.read(BUFFER_SIZE)

Это нормально работает для нормальной работы и для остановленного потока.Однако, если я выбрал размер буфера больше одного байта, чтение будет блокироваться потенциально навсегда, если количество доступных байтов больше 0, но меньше размера буфера.

Блокировка на конечное времявсе в порядке, но мне нужно иметь способ изящно прервать цикл ( без закрытия потока из другого потока).Насколько я знаю, блокировка read() не может быть отменена.

Моя интуиция говорит, что размер буфера 1 отрицательно влияет на производительность.Есть лучший способ сделать это?По сути, я ищу Python эквивалент C ++ для чтения .

Может быть, я решаю эту проблему с неправильной точки зрения.Также приветствуются альтернативные подходы.

1 Ответ

0 голосов
/ 05 мая 2019

Я только что прочитал эту статью .

Попробуйте использовать функцию iter () со вторым аргументом.

for chunk in iter(lambda: input_stream.read(BUFFER_SIZE), b''):
    dostuff(chunk)
...