Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python urllib2超时但不';t闭合插座连接_Python_Http_Sockets_Timeout_Urllib2 - Fatal编程技术网

Python urllib2超时但不';t闭合插座连接

Python urllib2超时但不';t闭合插座连接,python,http,sockets,timeout,urllib2,Python,Http,Sockets,Timeout,Urllib2,我正在制作一个python URL抓取程序。出于我的目的,我希望它能很快超时,所以我正在这样做 urllib2.urlopen(“http://.../,超时=2) 当然,它应该正确地超时。但是,它不需要关闭与服务器的连接,因此服务器认为客户机仍然处于连接状态。我如何让urllib2在连接超时后关闭连接 运行gc.collect()不起作用,如果我无能为力,我不想使用httplib 我能得到的最接近的结果是:第一次尝试将超时。服务器报告连接在第二次尝试超时时关闭。然后,服务器在第三次尝试超时时报

我正在制作一个python URL抓取程序。出于我的目的,我希望它能很快超时,所以我正在这样做

urllib2.urlopen(“http://.../,超时=2)

当然,它应该正确地超时。但是,它不需要关闭与服务器的连接,因此服务器认为客户机仍然处于连接状态。我如何让urllib2在连接超时后关闭连接

运行gc.collect()不起作用,如果我无能为力,我不想使用httplib

我能得到的最接近的结果是:第一次尝试将超时。服务器报告连接在第二次尝试超时时关闭。然后,服务器在第三次尝试超时时报告连接已关闭。无限的


非常感谢。

这是一个黑客攻击,但是下面的代码可以工作。如果请求在另一个函数中,并且没有引发异常,则套接字始终关闭

def _fetch(self, url):
    try:
        return urllib2.urlopen(urllib2.Request(url), timeout=5).read()
    except urllib2.URLError, e:
        if isinstance(e.reason, socket.timeout):
            return None
        else:
            raise e

def fetch(self, url):
    x = None
    while x is None:
        x = self._fetch(url)
        print "Timeout"
    return x

有人有更好的方法吗?

我怀疑堆栈框架中的套接字仍然处于打开状态。当Python引发异常时,它会存储堆栈帧,以便调试器和其他工具可以查看堆栈和内省值

出于历史原因,现在为了向后兼容,堆栈信息存储在sys中(基于每个线程)(请参见sys.exc_info()、sys.exc_type和其他)。这是Python 3.0中删除的内容之一

这对您来说意味着堆栈仍然是活动的,并且被引用。该堆栈包含具有开放套接字的某些函数的本地数据。这就是插座尚未关闭的原因。只有当堆栈跟踪被删除时,所有内容都将被gc’ed

要测试是否是这种情况,请插入以下内容

try:
  1/0
except ZeroDivisionError:
  pass

在你的除外条款中。这是一种用其他内容替换当前异常的快速方法。

Hmm!一个非常有趣的想法。谢谢,但它不太管用;然而,我从来没有这样想过。我认为对于我的项目来说,我的整个推理有点太老套了。对我来说,最好不要依赖于此,而只是终止服务器上的重复连接。