2013-05-22 8 views
6

私の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のバグだと私はまだ不思議です。

答えて

6

いいえ、接続が閉じられていないことはバグではないため、次の要求に接続を再利用する必要があります。

方法はと書かれていますが、サーバが接続を閉じるのを待つか、タイムアウトになるため、積極的に閉じません(エラーの場合を除きます)。接続が閉じられた場合、は次回の使用時に再確立を試みます。

接続を閉じると(ソースへのパッチのように)、これは不可能になります。すべての要求は、独自の接続を使用する必要があります。

オブジェクトを破棄すると、開いている接続が自動的に閉じられるはずです。つまり、作成したHttpオブジェクトへの参照を保持しないと、動作するはずです。あなたは参照をつかまえていないと確信していますか?

また、あなたのリクエストにConnnection: closeヘッダーを渡すことができます。

http.request("http://example.org", headers={'Connection': 'close'}) 

サーバーは、各要求の後に接続を閉じさせる必要があること。または、オブジェクトのconnections dictのすべての接続を手動で閉じることができます。

関連する問題