Обнаружение зависает с Python urllib2.urlopen
Я использую Python urllib2 для отправки сообщения 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 никогда не вернется.
Я знаю, что он никогда не возвращается, потому что у нас есть некоторые строки журнала в нашем фактическом коде, которые вызываются до и после, и когда возникает эта проблема, только вызовы до этого выполняются и script вечно ведется.
Какой лучший способ обнаружить/обработать это?
Ответы
Ответ 1
Вы можете использовать сигналы, сначала установите обработчик для вашего сигнала
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