How to properly retry websockets connection in python?

Viewed 697

This code tries to connect for 20 seconds. If the connection is established and lost then it tries to reconnect for 10 seconds. If the client can't connect or reconnect then it prints "Failure" and exits. If the server responds with "exit" then the client exits.

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"))

I don't like the explicit websocket.close(). How to use asyncio.wait_for with the context manager of the websocket?

0 Answers
Related