#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?