10

urllib.request.urlopen()を使用して、テストしようとしているWebサービスからGETしています。

これはHTTPResponseオブジェクトを返し、それをread()して応答本文を取得します。

しかし、socket.pyからの閉じられていないソケットに関するResourceWarningが常に表示されます

関連する関数は次のとおりです。

from urllib.request import Request, urlopen

def get_from_webservice(url):
    """ GET from the webservice  """
    req = Request(url, method="GET", headers=HEADERS)
    with urlopen(req) as rsp:
        body = rsp.read().decode('utf-8')
        return json.loads(body)

プログラムの出力に表示される警告は次のとおりです。

$ ./test/test_webservices.py
/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/socket.py:359: ResourceWarning: unclosed <socket.socket object, fd=5, family=30, type=1, proto=6>
self._sock = None
.s
----------------------------------------------------------------------
Ran 2 tests in 0.010s

OK (skipped=1)

HTTPResponse(またはRequest?)に対して、ソケットをきれいに閉じるためにできることがあれば、このコードは単体テスト用であるため、本当に知りたいと思います。私はどこでも警告を無視するのは好きではありませんが、特にそこにはありません。

4

2 に答える 2

5

これが答えかどうかはわかりませんが答えへの道のりの一部です。

Web サービスからの応答にヘッダー「connection: close」を追加すると、HTTPResponse オブジェクトは警告なしで適切にクリーンアップされるように見えます。

実際、HTTP 仕様 ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html ) は次のように述べています。

永続的な接続をサポートしない HTTP/1.1 アプリケーションは、すべてのメッセージに「閉じる」接続オプションを含める必要があります。

したがって、問題はサーバー側にありました (つまり、私のせいです!)。サーバーからのヘッダーを制御できない場合、何ができるかわかりません。

于 2013-05-23T11:04:51.527 に答える