Я не разбираюсь в сетевых вещах, не уверен, поможет ли этот ответ, но вот мои два цента.
Первое о выводе netstat.Это связанный маршрутизатор и, похоже, не связанный с вашими ограничениями ОС.Быстрый поиск в Google показывает следующее:
TIME_WAIT указывает, что локальная конечная точка (эта сторона) закрыла соединение.Соединение поддерживается так, что любые задержанные пакеты могут быть сопоставлены с соединением и обработаны соответствующим образом.Соединения будут удалены, когда они истекают в течение четырех минут.
Кажется, что ваш код закрыл соединение, т.е. делает все правильно.
Однако я понятия не имею, как маршрутизатор будет обрабатыватьпри увеличении количества таких соединений.
Давайте теперь рассмотрим ваш код.
То, что вы делаете в строке asyncio.wait(tasks)
, параллельно выполняет все ваши проверки.В зависимости от количества ips
это может быть слишком много.С большой вероятностью вы можете воспользоваться asyncio.Semaphore для ограничения максимального количества параллельных проверок.Это будет выглядеть следующим образом:
sem = asyncio.Semaphore(100)
async def check_port(ip, port, timeout=1):
async with sem:
# main code here
Вы также можете прочитать этот ответ , чтобы увидеть реальный пример использования семафора.
Следующие вещи, которые могут вам понадобитьсяисправить это так: CancelledError
:
except asyncio.CancelledError:
print("asyncio cancel")
Это не то, как задача должна реагировать на это исключение.Это никогда не должно подавлять это, только внешний код может это сделать.Прочитайте этот ответ , чтобы узнать, как это сделать.
except:
response = False
Вы никогда не делаете этого.Пожалуйста, прочитайте эту тему для получения подробной информации.
Вместо этого вы должны хотя бы сделать что-то вроде следующего:
except Exception as exc: # catch Exception or it's subclasses only
logging.exception(exc) # log for purpose not to miss exception you can fix
response = False