Как правильно использовать параметр времени ожидания в select?
Я новичок в программировании сокетов (и в некоторой степени и в Python), и у меня возникают проблемы с получением тайм-аута выбора для работы так, как я хочу (на стороне сервера). Перед подключением клиентов таймаут работает просто отлично. Я даю ему значение 1 секунда, и тайм-аут истекает в моем цикле каждую 1 секунду.
Однако, как только клиент подключается, он не ждет 1 секунду, чтобы сообщить мне, что время ожидания истекло. Он просто зацикливается так быстро, как только может, и сообщает, что время ожидания истекло. Вот фрагмент моего кода:
while running:
try:
self.timeout_expired = False
inputready, outputready, exceptready = select.select(self.inputs, self.outputs, [], self.timeout)
except select.error, e:
break
except socket.error, e:
break
if not (inputready):
# Timeout expired
print 'Timeout expired'
self.timeout_expired = True
# Additional processing follows here
Я не уверен, достаточно ли этого кода, чтобы увидеть, где моя проблема, поэтому, пожалуйста, дайте мне знать, если вам нужно больше узнать. По сути, после подключения клиента, по крайней мере, кажется, что он игнорирует время ожидания в 1 секунду и просто работает так быстро, как может, постоянно сообщая мне "Время ожидания истекло". Есть идеи, что мне не хватает?
Большое спасибо!!
Изменить: я должен уточнить..."inputready" представляет ввод от клиента, подключающегося или отправляющего данные на сервер, а также стандартный ввод с сервера. Другие переменные, возвращаемые из select, являются только серверными переменными, и я пытаюсь определить, слишком ли долго КЛИЕНТ отвечал, поэтому я проверяю только, является ли inputready пустым.
1 ответ
Это только тайм-аут, если inputready
, outputready
, а также exceptready
ВСЕ пустые. Я думаю, вы добавили клиентский сокет в оба self.inputs
а также self.outputs
, Поскольку выходной сокет обычно доступен для записи, он всегда будет отображаться в outputready
, Добавьте только клиентский сокет в self.outputs
если вы готовы что-то вывести.
"По истечении времени ожидания select() возвращает три пустых списка.... Чтобы использовать время ожидания, необходимо добавить дополнительный аргумент к вызову select() и обработать пустые списки после возврата из select()".
readable, writable, exceptional = select.select(inputs, outputs, inputs,timeout)
if not (readable or writable or exceptional):
print(' timed out, do some other work here', file=sys.stderr)