我的Python程序使用httplib2.Http来进行HTTP请求。一旦我需要生成一个请求,我就会创建一个httplib2.Http对象,因此我的程序会频繁地创建/销毁httplib2.Http对象。
我发现,由于打开的文件数达到了最大值,我的程序很容易崩溃。在检查/proc//fd时,发现有太多的打开套接字fd。这个问题让我不得不深入研究httplib2源代码。
然后我发现,在httplib2.Http._conn_request方法中,有如下代码:
这表明当HTTP方法为HEAD时,套接字才会关闭。也许httplib2想要重用该套接字。但是Http类没有close()方法。这意味着当我发出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是一个非常古老和常见的库。