我的python程序总是在运行数小时后关闭我的internet连接,如何调试和修复此问题?

我的python程序总是在运行数小时后关闭我的internet连接,如何调试和修复此问题?,python,multithreading,network-programming,urllib2,mechanize,Python,Multithreading,Network Programming,Urllib2,Mechanize,我正在编写一个python脚本来检查/监控多个服务器/网站的状态(响应时间和类似的东西),这是一个GUI程序,我使用单独的线程来检查不同的服务器/网站,每个线程的基本结构是使用一个无限while循环,在每个随机时间段(15到30秒)请求该网站,一旦网站/服务器发生变化,每个线程将启动一个新线程进行彻底检查(请求更多页面和类似内容) 问题是,在运行这个脚本几个小时后,我的互联网连接总是被阻塞/阻塞/混乱,情况是,从我的脚本端,每次请求页面时,我都会收到urlopen错误超时,从我的FireFox浏

我正在编写一个python脚本来检查/监控多个服务器/网站的状态(响应时间和类似的东西),这是一个GUI程序,我使用单独的线程来检查不同的服务器/网站,每个线程的基本结构是使用一个无限while循环,在每个随机时间段(15到30秒)请求该网站,一旦网站/服务器发生变化,每个线程将启动一个新线程进行彻底检查(请求更多页面和类似内容)

问题是,在运行这个脚本几个小时后,我的互联网连接总是被阻塞/阻塞/混乱,情况是,从我的脚本端,每次请求页面时,我都会收到urlopen错误超时,从我的FireFox浏览器端,我无法打开任何站点。但奇怪的是,当我关闭脚本时,我的互联网连接立即恢复,这意味着现在我可以通过浏览器浏览任何网站,所以一定是脚本造成了所有问题

我仔细检查了程序,甚至使用
del
删除任何连接,一旦使用,仍然会遇到同样的问题。我只使用urllib2、urllib、mechanize来执行网络请求

有人知道为什么会发生这种事吗?如何调试此问题?一旦出现这种情况,是否有工具或东西来检查我的网络状态?这真的困扰了我一段时间

顺便问一下,我支持VPN,这和这个问题有关吗?虽然我不这么认为,因为我的网络总是在脚本关闭后恢复正常,而且VPN连接在整个过程中从未中断(看起来是这样)

[更新:]

刚刚发现更多关于这个问题的信息,当我的程序关闭互联网连接时,它并不是完全“关闭”,我的意思是,我不能在浏览器中打开任何网站,或者总是得到urlopen错误超时,但我仍然可以在命令行中使用“ping google.com”获得回复。当我手动断开VPN连接,然后重拨时,在不关闭程序的情况下,它会重新开始工作,而且我可以通过浏览器上网。为什么会发生这种情况?

  • 您可能创建的线程比预期的要多-监视
    threading.active\u count()
    的结果以测试这一点

  • 如果可能的话,试着排除你这边的VPN(或者发布相关的代码,这样我们就可以测试它)

  • (Nettiquete)如果您还没有这样做,请仅使用network.http.max connections per serverthreads per monitored site/host

  • (供参考)
    urlopen
    返回类似对象的文件-在该对象上使用
    .close()
    del
    ,否则套接字将处于关闭等待状态,直到超时


希望这些点都是指针。

这可能是问题所在,也可能不是问题所在,但在处理打开资源(如文件或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>
导入上下文库 >>>使用contextlib.closing(urllib2.urlopen('http://www.python.org))作为第页: ... 对于第页中的行: ... 打印(行) 布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉布拉
这样,连接将在with块的末尾关闭并删除,因此您不必考虑它。:-)

del很少有用。我想你已经接近了?这应该足够了。不知道如何帮助您调试它。@Lennart:So:
response=urllib2.urlopen(“http://google.com“
,是否将
del response
关闭此连接?否,
delresponse
仅删除局部变量
response
,从而删除对urllib对象的一个引用。如果它是对响应对象的唯一引用,它将被删除,是的,将被关闭。但这不应该用
del
手动完成,而应该让它超出范围。如果不确定,可以对对象手动调用
close()
,但这应该不是必需的。但听起来你的应用程序没有问题。@Shane:没有。del会把它标记为垃圾收集。它将在收集时关闭,这可能是另一个时间完全关闭。你应该调用response.close()。@Shane:我想这就是问题所在。您将以大量打开的连接结束,直到您的计算机耗尽句柄。确保你关闭了连接,生活就会好起来
del
几乎毫无用处,因为您无法控制连接何时或是否关闭。是否有方法/工具来检查我的网络中发生了什么,以及在我出现问题时python对我的网络做了什么?非常感谢。确实是
del
造成了所有的问题,我使用
netstat
发现了大量的“Close\u Wait”连接,这些连接耗尽了所有的资源,这就是为什么从那时起我得到了urlerror timeout。将所有
del
更改为
.close()
后,现在一切正常^_^