Обнаружение зависает с 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 + сокеты
  • Отображать вывод во внутренней части raw_input ()
  • Python сокет-сервер / клиентское программирование
  • NetDisturb с использованием Python
  • Асинхронные сокеты с выделенным - Python
  • Исключение исключения таймаута сокета
  • Существуют ли простые описания перенаправления портов с использованием python?
  • Python - лучший язык программирования в мире.