Моята програма python винаги прекъсва интернет връзката ми след няколко часа работа, как да отстраня грешки и да поправя този проблем?

Пиша скрипт на Python, който проверява/наблюдава състоянието на няколко сървъра/уебсайта (време за реакция и подобни неща), това е GUI програма и използвам отделна нишка, за да проверя различен сървър/уебсайт и основната структура на всяка нишка използва безкраен докато цикъл, за да поиска този сайт на всеки случаен период от време (15 до 30 секунди), след като има промени в уебсайта/сървъра, всяка нишка ще започне нова нишка, за да направи задълбочена проверка (заявка за повече страници и подобни неща).

Проблемът е, че моята интернет връзка винаги се блокира/засяда/обърква след няколко часа изпълнение на този скрипт, ситуацията е, че от страна на моя скрипт получавам urlopen error time out всеки път, когато иска страница, и от страна на моя браузър FireFox Не мога да отворя нито един сайт. Но странното е, че в момента, в който затворих скрипта си, интернет връзката ми се възстанови незабавно, което означава, че сега мога да сърфирам във всеки сайт през браузъра си, така че трябва да е скриптът, който причинява целия проблем.

Проверих внимателно програмата и дори използвам del за изтриване на всяка връзка, след като бъде използвана, все още получавам същия проблем. Използвам само urllib2, urllib, mechanize за извършване на мрежови заявки.

Някой знае ли защо се случва такова нещо? Как да отстраня грешки в този проблем? Има ли инструмент или нещо, което да проверя състоянието на мрежата ми, след като възникне такава ситуация? Наистина ме мъчи известно време...

Между другото аз съм зад VPN, има ли нещо общо с този проблем? Въпреки че не мисля така, защото моята мрежа винаги се връща, след като скриптът се затвори, и VPN връзката никога не прекъсва (както изглежда) по време на целия процес.

[Актуализации:]

Току-що намерих повече информация за този проблем, когато моята програма прекъсне връзката с интернет, добре, не е напълно „намалена“, искам да кажа, че не мога да отворя нито един сайт в браузъра си или винаги получавам urlopen error timed out, но все пак мога да получа отговорете с помощта на "ping google.com" в cmd ред. И когато ръчно прекъснах VPN връзката, след това набирам отново, без да затварям програмата си, тя започва да работи отново и също мога да сърфирам в мрежата през браузъра си. Защо това се случва?


person Shane    schedule 14.01.2011    source източник
comment
del рядко е полезен. Предполагам, че затваряте ()? Това би трябвало да е достатъчно. Все пак няма идея как да ви помогна да го отстраните.   -  person Lennart Regebro    schedule 14.01.2011
comment
@Lennart: И така: response = urllib2.urlopen("http://google.com"), би ли del response затворил тази връзка?   -  person Shane    schedule 14.01.2011
comment
Не, del response просто премахва локалната променлива response, като по този начин премахва една препратка към обекта urllib. Ако това е единствената препратка към обекта на отговора, той ще бъде изтрит и, да, затворен. Но това не трябва да се прави ръчно с del, вместо това трябва да го оставите да излезе извън обхвата. Ако не сте сигурни, можете ръчно да извикате close() на обекти, но това не трябва да е необходимо. Но това не звучи като проблем с вашето приложение.   -  person Rosh Oxymoron    schedule 14.01.2011
comment
@Shane: Не. del ще го маркира за събиране на боклук. Ще бъде затворен, когато бъде събран, което може да бъде някой друг път напълно. Трябва да извикате response.close().   -  person Lennart Regebro    schedule 14.01.2011
comment
@Rosh: Просто не знам защо скриптът ми прекъсва мрежата ми и след като скриптът се затвори, мрежата ми се връща веднага. И се причинява от urlopen error timed out всеки път. Това наистина ме ядоса   -  person Shane    schedule 14.01.2011
comment
@Shane: Извикваш ли .close() или не?   -  person Lennart Regebro    schedule 14.01.2011
comment
@Lennart: Още не, ще опитам, въпреки че не мисля, че това е проблемът... Просто не знам къде да гледам и как да намеря проблема   -  person Shane    schedule 14.01.2011
comment
@Shane: Мисля, че това е проблемът. Ще се окажете с купища отворени връзки, докато компютърът ви не свърши дръжките. Уверете се, че сте затворили () връзките и животът ще бъде наред. del е почти безполезен, тъй като нямате контрол върху това кога или дори дали връзката се затваря.   -  person Lennart Regebro    schedule 14.01.2011
comment
@Lennart: Току-що разбрах, че все още мога да получа отговор от ping google.com, докато мрежата ми не работи, въпреки че не мога да сърфирам в нито един сайт в браузъра си, какъв проблем с мрежата е това?   -  person Shane    schedule 15.01.2011
comment
@Shane: Все още изглежда, че имате твърде много отворени връзки. Отварянето на уеб страница създава TCP връзка, ping изпраща ICMP пакет, TCP връзките ви изчерпват, защото не използвате close().   -  person Lennart Regebro    schedule 15.01.2011


Отговори (2)


Това може или не може да е проблемът, но е добра идея винаги да използвате контекстни мениджъри, когато работите с неща, които отварят ресурси, като файлове или 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, така че не е нужно да мислите за това. :-)

person Lennart Regebro    schedule 14.01.2011
comment
Има ли начин/инструмент да проверя какво се случва в моята мрежа и какво прави python с моята мрежа, докато възникне проблемът ми? - person Shane; 14.01.2011
comment
Благодаря много човече. Наистина del причинява всички проблеми, открих тонове Close_Wait връзки, използвайки netstat, и тези връзки използваха всички ресурси, затова оттогава получих изчакване за urlerror. След като промених всички del на .close(), сега всичко работи добре. ^_^ - person Shane; 17.01.2011

  • Възможно е да създавате повече теми, отколкото очаквате - наблюдавайте резултата от threading.active_count(), за да тествате това.

  • Ако е възможно, опитайте да изключите VPN от своя страна (или публикувайте съответните вътрешности на кода, за да можем да го тестваме).

  • (Нетикет) Ако все още не го правите, използвайте само network.http.max-connections-per-server нишки за наблюдаван сайт/хост.

  • (За справка) urlopen връща подобен на файл обект - използвайте .close() или del за този обект или сокетът ще остане в състояние CLOSE_WAIT до изчакване.

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

person Dale Reidy    schedule 14.01.2011