Тайм-аут анонимного набора каналов Python
У меня есть ощущение, что это невозможно; но есть ли способ установить тайм-аут чтения на анонимном канале в Python / C на Linux?
Есть ли лучшие варианты, чем установка и захват SIGALRM?
>>> import os
>>> output, input = os.pipe()
>>> outputfd = os.fdopen(output, 'r')
>>> dir(outputfd)
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']
>>>
(нет метода settimeout())
2 ответов:
Вы должны попробовать использовать модуль
select, который позволяет вам предоставить тайм-аут. Добавьте объект file в набор select, а затем проверьте объект return, чтобы увидеть, изменился ли он:r, w, x = select.select([output], [], [], timeout)Затем исследуйте r, чтобы увидеть, читаем ли объект. Это можно распространить на любое количество объектов, которые вы хотите контролировать. Если объект находится в r, то выполните чтение:
output.read().Кроме того, вы можете использовать
os.read, а не fdopen, так как он не будет подчиняться капризам файла Python буферизация.
Это не прямая настройка,но вы можете использовать
selectв файловом дескрипторе для ожидания ввода. Это встроенный модуль, который поддерживает все файловые дескрипторы в Unix, но только сокеты в OpenVMS и Windows (со страницы pydoc наselect).
Comments