У меня есть интенсивный для данных Python скрипт, который использует HTTP-соединения для загрузки данных.Я обычно запускаю его на ночь.Иногда соединение не будет установлено, или веб-сайт будет на мгновение недоступен.У меня есть базовая обработка ошибок, которая перехватывает эти исключения и периодически повторяет попытки, корректно завершая работу (и регистрируя ошибки) после 5 минут повторных попыток.
Однако я заметил, что иногда работа просто зависает.Ошибка не выдается, и задание все еще выполняется, иногда через несколько часов после последнего сообщения печати.
Как лучше всего:
- монитор скрипт Python,
- обнаружение , если он не отвечаетчерез заданный интервал
- выход это, если он не отвечает,
- и запуск еще один?
ОБНОВЛЕНИЕ
Спасибо всем за помощь.Как отмечали некоторые из вас, для модулей urllib и socket тайм-ауты не установлены правильно.Я использую Python 2.5 с модулями Freebase и urllib2 , а также ловлю и обрабатываю MetawebErrors и urllib2.URLErrors .Вот пример вывода ошибок после того, как последний скрипт завис на 12 часов:
File "/home/matthew/dev/projects/myapp_module/project/app/myapp/contrib/freebase/api/session.py", line 369, in _httpreq_json
resp, body = self._httpreq(*args, **kws)
File "/home/matthew/dev/projects/myapp_module/project/app/myapp/contrib/freebase/api/session.py", line 355, in _httpreq
return self._http_request(url, method, body, headers)
File "/home/matthew/dev/projects/myapp_module/project/app/myapp/contrib/freebase/api/httpclients.py", line 33, in __call__
resp = self.opener.open(req)
File "/usr/lib/python2.5/urllib2.py", line 381, in open
response = self._open(req, data)
File "/usr/lib/python2.5/urllib2.py", line 399, in _open
'_open', req)
File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain
result = func(*args)
File "/usr/lib/python2.5/urllib2.py", line 1107, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.5/urllib2.py", line 1080, in do_open
r = h.getresponse()
File "/usr/lib/python2.5/httplib.py", line 928, in getresponse
response.begin()
File "/usr/lib/python2.5/httplib.py", line 385, in begin
version, status, reason = self._read_status()
File "/usr/lib/python2.5/httplib.py", line 343, in _read_status
line = self.fp.readline()
File "/usr/lib/python2.5/socket.py", line 372, in readline
data = recv(1)
KeyboardInterrupt
Вы увидите ошибку сокета внизу.Поскольку я использую Python 2.5 и не имею доступа к третьему параметру urllib2.urlopen , есть ли другой способ отслеживать и отлавливать эту ошибку?Например, я ловлю URLErrrors - есть ли другой тип ошибки в urllib2 или сокете , который я могу поймать, который поможет мне?