urlopen вызов с тайм-аутом не прекращается после тайм-аута - PullRequest
2 голосов
/ 10 декабря 2011

В Python 2.4.4 я использую urllib2.urlopen() для запроса ресурса. Перед выполнением запроса я устанавливаю таймаут с помощью:

socket.setdefaulttimeout(10)

(Эта версия Python слишком старая, чтобы иметь версию urlopen() со встроенным таймаутом.)

В большинстве случаев это работает нормально. Однако я наткнулся на сервер, который просто зависает по запросу. В Chrome браузеру не хватает почти 5 минут, и он говорит:

Google Chrome не смог загрузить веб-страницу, поскольку SERVERNAME слишком долго отвечал. Возможно, веб-сайт не работает или у вас проблемы с подключением к Интернету.

В Python запрос urlopen, кажется, зависает бесконечно, несмотря на установку короткого времени ожидания. Что именно контролирует socket.setdefaulttimeout(), и есть ли способ принудительно установить жесткий тайм-аут для этих соединений (если прошло 10 секунд, независимо от того, что еще происходит, прекратите попытку)?

1 Ответ

0 голосов
/ 12 июля 2012
Сокет
def _reset_timeout(self, timeout=None):
    socket.setdefaulttimeout(timeout)

def _set_timeout(self, timeout=None):
    if timeout:
        socket.setdefaulttimeout(timeout)



default_timeout = socket.getdefaulttimeout()
try:
    self._set_timeout(timeout)
    req = urllib2.Request(url)
    response = urllib2.urlopen(request)

finally:
    self._reset_timeout(default_timeout)

имеет свое время ожидания.Для каждого вашего запроса, установите желаемое время ожидания, а затем сбросьте время ожидания (во всех случаях, включая сбои)

Может случиться так, что в некоторых случаях сервер не отвечает и время ожидания истекаетдольше, чем вы установили.

Здесь, в приведенном выше коде, мы получаем тайм-аут по умолчанию (какой бы он ни был), и для нашего запроса мы устанавливаем его на то, что хотим, а затем сбрасываем на то, что былочто мы ничего не меняем.

...