web-dev-qa-db-ja.com

PythonリクエストはHTTP接続を閉じます

リクエスト(python-requests.org)との接続をどのように閉じますか?

httplibではHTTPConnection.close()ですが、リクエストでも同じようにするにはどうすればよいですか?

コードは次のとおりです。

    r = requests.post("https://stream.Twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))

    for line in r.iter_lines():
        if line:
            self.mongo['db'].tweets.insert(json.loads(line))

前もって感謝します。

36
user179169

here で説明したように、HTTP接続のようなものは実際には存在せず、HTTPConnectionが実際に基になるTCPあなたのリクエストについて本当に多くのことを知っているのです。

Requestsの最新バージョンは、実際にリクエスト後TCP接続を維持します。TCP接続を閉じたい場合、 keep-alive を使用しないリクエスト。

s = requests.session()
s.config['keep_alive'] = False
22
Felix Fung

接続を閉じるより確実な方法は、サーバーに明示的に閉じるように指示することだと思います HTTP仕様に準拠

HTTP/1.1は、送信者が「完了」接続オプションを定義して、応答の完了後に接続が閉じられることを通知します。例えば、

   Connection: close

要求または応答ヘッダーフィールドのいずれかは、現在の要求/応答が完了した後、接続が「永続的」(セクション8.1)と見なされるべきではないことを示します。

Connection: closeヘッダーが実際のリクエストに追加されます。

r = requests.post(url=url, data=body, headers={'Connection':'close'})
52
Oleg Gryb

_"too many open files" error_を解決するためにこの質問に来ましたが、コードでrequests.session()を使用しています。数回の検索の後、未処理の例外がある場合でもセッションが終了するようにwithブロックを使用することを提案する Python Requests Documentation で答えを見つけました。

_with requests.Session() as s:
    s.get('http://google.com')
_

セッションを使用していない場合、実際には同じことを行うことができます: http://docs.python-requests.org/en/master/api/#requests.Response.close

_with requests.get('http://httpbin.org/get', stream=True) as r:
    # Do something
_
10
stwhite

要求1.Xでは、接続は応答オブジェクトで利用できます。

r = requests.post("https://stream.Twitter.com/1/statuses/filter.json",
                  data={'track': toTrack}, auth=('username', 'passwd'))

r.connection.close()
10
Wilfred Hughes

「too many open files」エラーを避けるために、response.close()を使用して閉じてください

例えば:

r = requests.post("https://stream.Twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))
....
r.close()
8
hatcher

これは私のために働く:

res = requests.get(<url>, timeout=10).content
requests.session().close()
2
user1990614