私の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 のバグなのかどうかはまだ興味があります。