тайм-аут для urllib2.urlopen () в пред версии Python 2.6

Использование версии Chrome 67.0.3396.62 (+)

  1. Запустить узел app

node --inspect = 0.0.0.0: 9229 server .js

blockquote>
  1. Открыть DevTools.
  2. Щелкните значок узла рядом с пиктограммой чувствительного устройства.

Появится другое окно DevTools, которое выйдет специально для приложения узла для отладки.

28
задан rubayeet 18 January 2010 в 08:49
поделиться

5 ответов

вы можете установить глобальный таймаут для всех операций с сокетами (включая HTTP запросы), используя:

socket.setdefaulttimeout()

подобно этому:

import urllib2
import socket
socket.setdefaulttimeout(30)
f = urllib2.urlopen('http://www.python.org/')

в этом случае, ваш запрос urllib2 будет таймаутом по истечении 30 секунд и бросит исключение для сокета. (это было добавлено на Python 2.3)

.
57
ответ дан 28 November 2019 в 02:51
поделиться

При значительном раздражении вы можете переопределить класс httplib.HTTPConnection, который использует urllib2.HTTPHandler.

def urlopen_with_timeout(url, data=None, timeout=None):

  # Create these two helper classes fresh each time, since
  # timeout needs to be in the closure.
  class TimeoutHTTPConnection(httplib.HTTPConnection):
    def connect(self):
      """Connect to the host and port specified in __init__."""
      msg = "getaddrinfo returns an empty list"
      for res in socket.getaddrinfo(self.host, self.port, 0,
                      socket.SOCK_STREAM): 
        af, socktype, proto, canonname, sa = res
        try:
          self.sock = socket.socket(af, socktype, proto)
          if timeout is not None:
            self.sock.settimeout(timeout)
          if self.debuglevel > 0:
            print "connect: (%s, %s)" % (self.host, self.port)
          self.sock.connect(sa)
        except socket.error, msg:
          if self.debuglevel > 0:
            print 'connect fail:', (self.host, self.port)
          if self.sock:
            self.sock.close()
          self.sock = None
          continue
        break
      if not self.sock:
        raise socket.error, msg

  class TimeoutHTTPHandler(urllib2.HTTPHandler):
    http_request = urllib2.AbstractHTTPHandler.do_request_
    def http_open(self, req):
      return self.do_open(TimeoutHTTPConnection, req)

  opener = urllib2.build_opener(TimeoutHTTPHandler)
  opener.open(url, data)
4
ответ дан Philip Z 14 October 2019 в 10:23
поделиться

Я использую httplib из стандартной библиотеки. У него очень простой API, но он обрабатывает только http, как вы можете догадаться. IIUC urllib использует httplib для реализации http.

1
ответ дан Kris Walker 14 October 2019 в 10:23
поделиться

Что ж, время ожидания в 2.4 или 2.6 одинаково. Если вы откроете файл urllib2.py в 2.6, вы увидите, что он принимает дополнительный аргумент в качестве тайм-аута и обрабатывает его с помощью метода socket.defaulttimeout (), как упоминалось в ответе 1.

Так что вам действительно не нужно обновлять ваш urllib2.py в этом случае.

0
ответ дан Konark Modi 14 October 2019 в 10:23
поделиться

Я думаю, что ваш лучший выбор - это исправить (или развернуть локальную версию) вашего URLLIB2 с Изменение от 2,6 ветвь обслуживания

файл должен быть в /usr/lib/python2.4/urllib2.py (на Linux и 2.4)

2
ответ дан 28 November 2019 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: