Типичным подходом является использование select () для ожидания получения данных или истечения времени ожидания. Звоните recv()
только тогда, когда данные действительно доступны. Для безопасности мы также устанавливаем сокет в неблокирующий режим, чтобы гарантировать, что recv()
никогда не будет блокироваться бесконечно. select()
также можно использовать для ожидания более чем одного сокета одновременно.
import select
mysocket.setblocking(0)
ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
data = mysocket.recv(4096)
Если у вас много открытых файловых дескрипторов, poll () является более эффективной альтернативой select()
.
Другой вариант - установить время ожидания для всех операций в сокете, используя socket.settimeout()
, но я вижу, что вы явно отклонили это решение в другом ответе.