gpt4 book ai didi

python - 同时使用 session 上下文管理器和 stream=True

转载 作者:行者123 更新时间:2023-11-28 17:10:43 31 4
gpt4 key购买 nike

我想知道这段代码是否安全:

import requests
with requests.Session() as s:
response = s.get("http://google.com", stream=True)
content = response.content

例如像这样简单,这不会失败(注意我没有写“它有效”:p),因为池不会立即关闭连接(这是 session /池的一个点,对吧?) .

使用 stream=True,响应对象应该有包含连接的 raw 属性,但我不确定连接是否由 session 拥有或不,然后如果在某个时候我不是现在而是稍后阅读内容,它可能已经关闭。

我目前的 2 美分是它不安全,但我不是 100% 确定。

谢谢!

[阅读请求代码后编辑]

在更详细地阅读了请求代码之后,这似乎是 requests.get 正在做的事情:

https://github.com/requests/requests/blob/master/requests/api.py

def request(method, url, **kwargs):
with sessions.Session() as session:
return session.request(method=method, url=url, **kwargs)

因为 kwargs 可能包含 stream

所以我猜答案是“它是安全的”。

最佳答案

好的,我通过挖掘 requestsurllib3

得到了答案

Response 对象拥有连接,直到显式调用 close() 方法:

https://github.com/requests/requests/blob/24092b11d74af0a766d9cc616622f38adb0044b9/requests/models.py#L937-L948

def close(self):
"""Releases the connection back to the pool. Once this method has been
called the underlying ``raw`` object must not be accessed again.
*Note: Should not normally need to be called explicitly.*
"""
if not self._content_consumed:
self.raw.close()

release_conn = getattr(self.raw, 'release_conn', None)
if release_conn is not None:
release_conn()

release_conn() 是一个 urllib3 方法,它释放连接并将其放回池中

def release_conn(self):
if not self._pool or not self._connection:
return

self._pool._put_conn(self._connection)
self._connection = None

如果 Session 被销毁(如使用 with),池被销毁,连接无法恢复,它只是关闭。

长话短说;这是安全的。

请注意,这也意味着在 stream 模式下,在显式关闭响应或完全读取内容之前,连接对池不可用。

关于python - 同时使用 session 上下文管理器和 stream=True,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47706382/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com