Обнаружение зависает с Python urllib2.urlopen

Я использую urlib2 для Python для отправки HTTP-сообщения:

import socket, urllib, urllib2 socket.setdefaulttimeout(15) postdata = urllib.urlencode({'value1' : 'a string', 'value2' : 'another string'}) headers = { 'User-Agent': 'Agent', 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'text/html, */*', } try: request = urllib2.Request('http://www.example.com', postData, headers) response = urllib2.urlopen(request) except urllib2.HTTPError, e: # Handle here except urllib2.URLError, e: # Handle here except httplib.HTTPException, e: # Handle here 

Иногда проблема с сетью приводит к тому, что вызов urlopen никогда не возвращается. Мы видим, что другие ошибки (включая таймауты) обрабатываются правильно блоком except и имеют вызов socket.setdefaulttimeout (), но все еще есть случаи, когда urlopen никогда не вернется.

Я знаю, что он никогда не возвращается, потому что у нас есть некоторые строки журнала в нашем фактическом коде, которые вызываются до и после, и когда возникает эта проблема, только вызовы до этого выполняются, и скрипт висит навсегда.

Каков наилучший способ обнаружить / обработать это?

One Solution collect form web for “Обнаружение зависает с Python urllib2.urlopen”

Вы можете использовать сигналы, сначала установите обработчик для вашего сигнала

 import signal ... def handler(signum, frame): print 'Signal handler called with signal', signum ... signal.signal(signal.SIGALRM, handler) 

и поставить будильник перед вызовом urlopen

 signal.alarm(5) response = urllib2.urlopen(request) signal.alarm(0) # Disable the signal 

через 5 секунд (или время, когда вы захотите) ОС вызовет обработчик, если тревога не отключена (если urlopen никогда не возвращается). Подробнее о сигнальном модуле: http://docs.python.org/library/signal.html

  • Сервер сокета Python: отклонить соединение с адреса
  • Python Sniffing из книги Black Hat Python
  • Обработка ошибки тайм-аута в сокетах python
  • Python: отправка данных между двумя компьютерами через сокеты
  • Получите IP-маску от IP-адреса и длины маски в Python
  • Чтение из сокета: гарантировано ли, по крайней мере, получить x байтов?
  • Python P2P Sockets Chat Script работает только в домашней сети (не в школьной сети)
  • Как получить порты, которые прослушивает процесс?
  • как бороться с Python BaseHTTPServer убит, но порт по-прежнему занят?
  • Подмена IP-адреса источника HTTP-запроса
  • NetDisturb с использованием Python
  • Python - лучший язык программирования в мире.