【发布时间】:2021-10-18 10:59:12
【问题描述】:
我正在尝试在我的一个项目中使用 aiohttp,并努力弄清楚如何创建持久的aiohttp.ClientSession 对象。我浏览了官方的 aiohttp 文档,但在这方面没有找到帮助。
我浏览了其他在线论坛,发现自从 aiohttp 创建以来发生了很多变化。在 github 上的一些示例中,aiohttp 作者显示在 coroutine 函数(即 class Session: def __init__(self): self.session = aiohttp.ClientSession())之外创建 ClientSession。我还发现不应该在协程之外创建ClientSession。
我尝试了以下方法:
class Session:
def __init__(self):
self._session = None
async def create_session(self):
self._session = aiohttp.ClientSession()
async fetch(self, url):
if self._session is None:
await self.create_session()
async with self._session.get(url) as resp:
return await resp.text()
我收到很多关于 UnclosedSession 和连接器的警告。我也经常得到 SSLError。我还注意到,三分之二的呼叫挂起,我必须按 CTRL+C 才能杀死它。
使用requests,我可以简单地初始化__init__ 中的session 对象,但它不像aiohttp 那样简单。
如果我使用以下内容(这是我在各处看到的示例),我看不到任何问题,但不幸的是,在这里我最终会为每个请求创建 ClientSession。
def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.text()
我可以将aiohttp.ClientSession() 包装在另一个函数中并将其用作上下文管理器,但是每次调用包装函数时,我最终都会创建一个新的session 对象。我想弄清楚如何在类命名空间中保存 aiohttp.ClientSession 并重用它。
任何帮助将不胜感激。
【问题讨论】:
标签: python-3.7 aiohttp