Python3 urllib.request не будет закрывать соединения немедленно

У меня есть следующий код для запуска непрерывного цикла для получения некоторого контента с веб-сайта:

from http.cookiejar import CookieJar from urllib import request cj = CookieJar() cp = request.HTTPCookieProcessor(cj) hh = request.HTTPHandler() opener = request.build_opener(cp, hh) while True: # build url req = request.Request(url=url) p = opener.open(req) c = p.read() # process c p.close() # check for abort condition, or continue 

Содержимое читается правильно. Но почему-то TCP-соединения не закрываются. Я наблюдаю за активным числом подключений от интерфейса маршрутизатора dd-wrt, и он постоянно растет. Если скрипт продолжает работать, он исчерпает ограничение соединения 4096 маршрутизатора. Когда это произойдет, сценарий просто войдет в состояние ожидания (маршрутизатор не разрешит новые подключения, но таймаут еще не ударил). Через пару минут эти соединения будут закрыты, и сценарий может возобновиться снова.

Я смог наблюдать состояние этих висящих соединений от маршрутизатора. Они имеют одно и то же состояние: TIME_WAIT.

Я ожидаю, что этот скрипт будет использовать не более одного TCP-соединения одновременно. Что я делаю не так?

Я использую Python 3.4.2 в Mac OS X 10.10.

One Solution collect form web for “Python3 urllib.request не будет закрывать соединения немедленно”

В ходе некоторых исследований я обнаружил причину этой проблемы: дизайн протокола TCP . В двух словах, когда вы отключитесь, соединение сразу не отбрасывается, оно переходит в состояние TIME_WAIT и истечет через 4 минуты. В отличие от того, что я ожидал, соединение сразу не исчезает.

В соответствии с этим вопросом также невозможно принудительно удалить соединение (без перезапуска сетевого стека).

Оказывается, в моем конкретном случае, как заявил этот вопрос , лучшим вариантом было бы использовать постоянное соединение, например, HTTP keep-alive. Поскольку я запрашиваю тот же сервер, это будет работать.

  • Urllib и проверка сертификата сервера
  • Ошибка ввода-вывода (ошибка сокета): Соединение отклонено
  • Как я могу получить последнее модифицированное время с помощью python3 urllib?
  • Python urllib.request.urlopen () возвращает ошибку 10061?
  • Python3: JSON POST Request БЕЗ запросов библиотеки
  • Как поймать ошибку 404 в urllib.urlretrieve
  • Python 3.5.1 urllib не имеет запроса атрибута
  • POST-запрос с данными Multipart / form-data. Недопустимый тип содержимого
  • Python - лучший язык программирования в мире.