В одном из моих сценариев я использую следующий бесконечный цикл для проверки активного интернет-соединения:
def online_check():
try:
con = urllib2.urlopen("http://www.google.com/")
data = con.read()
logging.debug('{0} Reached the host. Exiting online_check'.format(time.strftime('[ %H:%M:%S ]')))
except:
logging.debug('{0} Could not reach host trying again in 3 seconds'.format(time.strftime('[ %H:%M:%S ]')))
time.sleep(3)
online_check()
Я знаю, что это не очень элегантное решение, но проблема в том, что когда я запускаю свой скрипт, он иногда вызывает метод online_check и застревает в середине его (один раз из примерно 200 попыток). Сценарий все еще выполняется, и исключение не выдается; скрипт просто застрял. Я могу нажать CTRL + C (даже после нескольких часов работы скрипта), и он просто выдаст исключение и продолжит следующую проверку online_check. Я также переписал скрипт для проверки IP-адреса в 'ifconfig', а не для проверки связи с Google, к сожалению, с похожими результатами.
Что я делаю не так? Могу ли я переписать сценарий, чтобы этого никогда не произошло? Что я могу сделать, чтобы узнать, что здесь происходит?
Помощь очень ценится. Btw. Я использую Python2.7.1 и пробовал этот скрипт как на Linux, так и на Mac.
P.S .: Если у вас есть рекомендации по разработке метода проверки подключения без использования полосы пропускания и минимальных накладных расходов, я был бы более чем рад это услышать.