リクエスト(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))
前もって感謝します。
here で説明したように、HTTP接続のようなものは実際には存在せず、HTTPConnectionが実際に基になるTCPあなたのリクエストについて本当に多くのことを知っているのです。
Requestsの最新バージョンは、実際にリクエスト後TCP接続を維持します。TCP接続を閉じたい場合、 keep-alive を使用しないリクエスト。
s = requests.session()
s.config['keep_alive'] = False
接続を閉じるより確実な方法は、サーバーに明示的に閉じるように指示することだと思います HTTP仕様に準拠 :
HTTP/1.1は、送信者が「完了」接続オプションを定義して、応答の完了後に接続が閉じられることを通知します。例えば、
Connection: close
要求または応答ヘッダーフィールドのいずれかは、現在の要求/応答が完了した後、接続が「永続的」(セクション8.1)と見なされるべきではないことを示します。
Connection: close
ヘッダーが実際のリクエストに追加されます。
r = requests.post(url=url, data=body, headers={'Connection':'close'})
_"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
_
要求1.Xでは、接続は応答オブジェクトで利用できます。
r = requests.post("https://stream.Twitter.com/1/statuses/filter.json",
data={'track': toTrack}, auth=('username', 'passwd'))
r.connection.close()
「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()
これは私のために働く:
res = requests.get(<url>, timeout=10).content
requests.session().close()