Как правильно повторить попытку подключения к websockets в python?

#python #python-asyncio #coroutine

Вопрос:

Этот код пытается подключиться в течение 20 секунд. Если соединение установлено и потеряно, оно пытается подключиться повторно в течение 10 секунд. Если клиент не может подключиться или повторно подключиться, он выводит «Сбой» и завершает работу. Если сервер отвечает «выход», то клиент завершает работу.

 import asyncio
import websockets


class Client:
    async def connect_with_retries(self, uri: str):
        while True:
            try:
                return await websockets.connect(uri)
            except (ConnectionError, websockets.exceptions.WebSocketException):
                await asyncio.sleep(5)

    async def loop(self, uri: str):
        connection_timeout = 20
        try:
            while True:
                websocket = await asyncio.wait_for(self.connect_with_retries(uri), connection_timeout)
                connection_timeout = 10
                try:
                    while True:
                        await websocket.send("req")
                        resp = await websocket.recv()
                        if resp == "exit":
                            return
                        await asyncio.sleep(1)
                except (ConnectionError, websockets.exceptions.WebSocketException) as exc:
                    pass
                finally:
                    await websocket.close()
        except asyncio.TimeoutError:
            print("Failure")


client = Client()
asyncio.run(client.loop("ws://localhost:8000"))
 

Мне не нравится откровенность websocket.close() . Как работать asyncio.wait_for с контекстным менеджером websocket?