私のpythonプログラムでは、httplib2.Httpを使用してhttpを要求しています。リクエストを生成する必要がある場合は、httplib2.Httpオブジェクトを作成します。これにより、自分のプログラムが頻繁にhttplib2.Httpオブジェクトを作成/破棄します。これはhttplib2のバグですか?
開いているファイルの数が最大に達したため、プログラムがクラッシュしやすくなりました。/proc // fdを調べると、オープンソケットfdsが多すぎます。この問題は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が非常に古く一般的なlibであることを考えると、実際にはhttplib2のバグだと私はまだ不思議です。