У меня есть символьное устройство, которое обычно доставляет несколько мегабайт в секунду двоичных данных.Однако устройство может сообщить об ошибке всего несколькими байтами.Кроме того, поток может зависнуть на неопределенное время - это не ошибка.Формат двоичных данных проприетарный, и я не могу его проанализировать.Мое клеевое приложение написано на 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 ++ для чтения .
Может быть, я решаю эту проблему с неправильной точки зрения.Также приветствуются альтернативные подходы.