Предположим, что структура уведомлений ввода / вывода (например, select
или часы GLib) только что уведомила меня о наличии данных, доступных по каналу.Предположим, что базовый файловый дескриптор находится в режиме блокировки, а не неблокирования.Как я могу прочитать столько данных, сколько доступно сразу, без блокировки?
Используя API системных вызовов Unix, я бы просто позвонил read()
.Кажется, что метод Python read()
для файловоподобных объектов имеет более сложное поведение - документация не совсем ясна, но у меня складывается впечатление, что он пытается выполнить несколько операций чтения ОС низкого уровня, пока не получит запрошенное число байтов или конец-of-файл.Чтобы прочитать только то, что доступно сразу, я должен получить базовый номер дескриптора файла и вызвать os.read()
для этого?
Кроме того, я могу вызвать os.read()
в цикле, пока он не вернет меньше, чемзапрашиваемое количество байтов?То есть я могу делать этот цикл каждый раз, когда select
уведомляет меня о наличии данных?Есть ли риск блокировки?