У меня есть сервер Python, который слушает на паре сокетов. При запуске я пытаюсь соединиться с этими сокетами перед слушанием, таким образом, я могу быть уверен, что ничто иное уже не использует тот порт. Это добавляет приблизительно три секунды к запуску моего сервера (который составляет приблизительно.54 секунд без теста), и я хотел бы обрезать его вниз. Так как я только тестирую localhost, я думаю, что тайм-аут приблизительно 50 миллисекунд более, чем вполне достаточен для этого. К сожалению, socket.setdefaulttimeout (50) метод, кажется, не работает по некоторым причинам.
Как я могу обрезать это вниз?
Как насчет того, чтобы просто попытаться выполнить привязку к нужному порту и обработать случай ошибки, если порт занят? (Если проблема заключается в том, что вы можете запустить одну и ту же службу дважды, а затем не смотреть на открытые порты.)
Это также разумный способ избежать возникновения состояния гонки, как сказал @eemz в другом ответе.
Вы используете Linux? Если это так, возможно, ваше приложение может запустить netstat -lant
(или netstat -lanu
, если вы используете UDP) и посмотреть, какие порты используются. Это должно быть быстрее ...
Ответ Саймона Б - это правильный путь - ничего не проверяйте, просто попробуйте привязать и обработать случай ошибки, если он уже используется.
В противном случае вы находитесь в состоянии гонки, когда какое-то другое приложение может захватить порт между вашей проверкой, что он свободен, и вашей последующей попыткой привязаться к нему. Это означает, что вам все равно придется обрабатывать возможность того, что ваш вызов привязки не удастся, поэтому предварительная проверка ничего не дала.