В одном из моих сценариев, я использую следующий бесконечный цикл для проверки активного подключения к Интернету:Python скрипт висит в петле
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», а не на pinging google, к сожалению, с аналогичными результатами.
Что я делаю неправильно? Могу ли я переписать сценарий, чтобы этого не произошло? Есть ли что-то, что я могу сделать, чтобы узнать, что здесь происходит?
справка приветствуется. Btw. Я использую Python2.7.1, и я пробовал этот скрипт как на Linux, так и на Mac.
P.S: Если у вас есть рекомендации по разработке метода, который проверяет подключение, не используя пропускную способность и минимальные накладные расходы, я был бы более чем счастлив услышать это.
Я удивлен, что вы не переполняете столик! –
Не могли бы вы объяснить это мне Гордон? вы просто переполнили мои мозговые стоки. –
См. http://en.wikipedia.org/wiki/Stack_overflow для получения дополнительной информации, но основная идея заключается в том, что каждый раз, когда вы вызываете функцию, вы должны нажимать новый кадр на стек вызовов, и это занимает память, и в итоге у вас закончится стоп вызовов и сбой. Буквально переполнение стека. Вы выбрали правильный сайт, чтобы задать этот вопрос. –