Моя программа на Python всегда прерывает соединение с Интернетом после нескольких часов работы, как мне отладить и устранить эту проблему? - PullRequest
2 голосов
/ 14 января 2011

Я пишу скрипт на Python, проверяющий / отслеживающий состояние нескольких серверов / веб-сайтов (время отклика и тому подобное), это программа с графическим интерфейсом, и я использую отдельный поток для проверки различных серверов / веб-сайтов, и основная структура каждого потока: используя бесконечный цикл while для запроса этого сайта каждый случайный промежуток времени (от 15 до 30 секунд), как только на веб-сайте / сервере происходят изменения, каждый поток запускает новый поток, чтобы выполнить тщательную проверку (запросить больше страниц и тому подобное).

Проблема в том, что мое интернет-соединение всегда блокировалось / блокировалось / портилось после нескольких часов работы этого скрипта, ситуация такова, что со стороны моего скрипта я получал ошибку urlopen по таймауту каждый раз, когда он запрашивал страницу, и из моего Сторона браузера Firefox Я не могу открыть ни один сайт. Но странная вещь заключается в том, что в тот момент, когда я закрываю свой сценарий, мое интернет-соединение немедленно восстанавливается, что означает, что теперь я могу просматривать любой сайт через свой браузер, так что это должен быть сценарий, вызывающий все проблемы.

Я тщательно проверил программу и даже использую del, чтобы удалить любое соединение, как только оно будет использовано, но проблема та же. Я использую только urllib2, urllib, mechanize для выполнения сетевых запросов.

Кто-нибудь знает, почему это происходит? Как мне отладить эту проблему? Есть ли инструмент или что-то, чтобы проверить состояние моей сети, когда такая ситуация возникает? Это действительно беспокоит меня некоторое время ...

Кстати, я за VPN, это как-то связано с этой проблемой? Хотя я так не думаю, потому что моя сеть всегда включается после закрытия скрипта, и VPN-соединение никогда не прерывается (как кажется) в течение всего процесса.

[ Обновление: ]

Только что нашел больше информации об этой проблеме, когда моя программа отключает интернет-соединение, ну, это не совсем "отключено", я имею в виду, я не могу открыть какой-либо сайт в своем браузере или всегда получаю тайм-аут по ошибке urlopen, но я все еще можете получить ответ, используя "ping google.com" в строке cmd. И когда я вручную отключил VPN-соединение, затем набрал номер, не закрывая программу, она снова начинает работать, и я также могу просматривать Интернет-страницы через свой браузер. Почему это происходит?

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Это может быть, а может и не быть проблемой, но всегда полезно использовать контекстные менеджеры при работе с вещами, которые открывают ресурсы, такими как файлы или URL-адреса.

Начиная с Python 2.5 вы можете делать это с файлами:

with open('/tmp/filename', 'rt') as infile:
    data = infile.read()
    whatever(data)

И файл будет автоматически закрыт в конце блока.

urllib2 не поддерживает это автоматически, но вы можете использовать contextlib, чтобы помочь вам:

>>> import contextlib
>>> with contextlib.closing(urllib2.urlopen('http://www.python.org')) as page:
...   for line in page:
...     print(line)
<html> blablablabla</html>

Таким образом, соединение будет закрыто и удалено в конце блока with, так что вам не нужно об этом думать. : -)

0 голосов
/ 14 января 2011
  • Возможно, вы создаете больше потоков, чем ожидаете - проверьте результат threading.active_count(), чтобы проверить это.

  • Если возможно, попробуйте исключитьVPN на вашем конце (или опубликуйте соответствующие элементы кода, чтобы мы могли его протестировать).

  • (Nettiquete) Если вы этого еще не сделали, используйте только network.http.max-connections-per-server потоков на отслеживаемый сайт / хост.

  • (для справки) urlopen возвращает file-like object - используйте .close() или del для этого объекта, иначе сокет будет находиться в состоянии CLOSE_WAIT до истечения времени ожидания.

Надеемся, что эти точкину, указатели.

...