如何在 Python 中暂停协程?

问题描述 投票:0回答:0

我有像 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,但有时我的请求会因异常而失败。

python-asyncio aiohttp
© www.soinside.com 2019 - 2024. All rights reserved.