我的 python 程序使用 httplib2.Http 发出 http 请求。一旦我需要生成一个请求,我就会创建一个 httplib2.Http 对象,这样我的程序就会频繁地创建/销毁 httplib2.Http 对象。
我发现由于达到最大打开文件数,我的程序很容易崩溃。检查 /proc//fd,打开的套接字 fd 太多。这个问题让我不得不深入研究 httplib2 源代码。
然后我发现,在 httplib2.Http._conn_request 方法中,有这样的代码:
else:
content = ""
if method == "HEAD":
conn.close()
else:
content = response.read()
response = Response(response)
if method != "HEAD":
content = _decompressContent(response, content)
break
这表明只有当 http 方法为 HEAD 时才会关闭套接字。也许 httplib2 想以某种方式重用套接字。但是 Http 类没有 close() 方法。这意味着当我发出 Http 请求时,套接字在我的进程终止之前不会关闭。
然后我修改了代码:
else:
content = ""
if method == "HEAD":
conn.close()
else:
content = response.read()
response = Response(response)
if method != "HEAD":
content = _decompressContent(response, content)
conn.close() # I ADD THIS CLOSE
break
在那之后,我的程序运行良好。
但是我仍然很好奇这是否真的是 httplib2 的错误,因为 httplib2 是一个非常古老且常见的库。