我有像 aiohttp 客户端会话的单例类。我的代码需要用 1 做出回应 会议。如果它们的寿命 > 15 分钟,我还需要重新创建会话。有时,请求A获取到session,生命周期为899秒时开始使用,但请求B也想获取session,导致重新创建。结果,第一个请求因异常而失败并且不执行。 我该怎么做?
class Session:
def __init__(self):
self.session = None
loop = asyncio.get_event_loop()
loop.create_task(self.create_session())
self.last_created = datetime.datetime.now().timestamp()
logger.info(f"Created session on {datetime.datetime.now()}")
async def create_session(self):
lock = asyncio.Lock()
await lock.acquire()
try:
if self.session is not None:
await self.session.close()
logger.debug("Closing old session")
self.session = aiohttp.ClientSession(connector=aiohttp.TCPConnector(limit=50), trust_env=True)
payload = {
"login": LOGIN,
"password": hashlib.md5(PASSWORD.encode()).hexdigest()
}
async with self.session.post(f"{URL}/login", json=payload) as response:
data = await response.json()
if data['code'] == "0":
self.last_created = datetime.datetime.now().timestamp()
logger.debug(f"Logged in")
return True
finally:
lock.release()
async def get_session(self):
lock = asyncio.Lock()
await lock.acquire()
if datetime.datetime.now().timestamp() - self.last_created > 900 and not self.session._connector._conns:
logger.debug(f"{datetime.datetime.now().timestamp() - self.last_created}, creating new session")
await self.create_session()
return self.session
logger.debug(f"{datetime.datetime.now().timestamp() - self.last_created}, returning old session")
lock.release()
return self.session
我尝试使用 Lock,但它没有帮助,或者我没有正确使用它。
此外,我尝试检查 session._connector._conns,但有时我的请求会因异常而失败。