Как установить ограничение по времени и количеству попыток подключения при использовании asyncio?

Как можно добавить в функцию `connect_whois_server` параметры таймаута соединения и количество попыток подключения? 

```python
async def connect_whois_server(domain=None, server=None, port=80, timeout=None, attempts=1):
    try:
        for attempt in range(attempts):
            try:
                reader, writer = await asyncio.open_connection(server, port, timeout=timeout)
                query = (domain + "\r\n").encode()
                writer.write(query)
                await writer.drain()

                response = b""
                while True:
                    data = await reader.read(4096)
                    if not data:
                        break
                    response += data
                writer.close()

                await writer.wait_closed()
                return response.decode()
            except asyncio.TimeoutError:
                print(f"Попытка {attempt+1}: Превышено время ожидания соединения.")
        print("Все попытки подключения завершились неудачно.")
        return None
    except Exception as e:
        print(f"Произошла ошибка при выполнении запроса: {e}")
        return None
```
  • 28 апреля 2024 г. 4:20
Ответы на вопрос 2
Чтобы установить ограничение по времени и количеству попыток подключения при использовании asyncio, можно скорректировать функцию `connect_whois_server` следующим образом:

```python
async def connect_whois_server(domain=None, server=None, port=80, timeout=None, attempts=1):
    try:
        for attempt in range(attempts):
            try:
                reader, writer = await asyncio.open_connection(server, port, timeout=timeout)
                query = (domain + "\r\n").encode()
                writer.write(query)
                await writer.drain()

                response = b""
                while True:
                    data = await asyncio.wait_for(reader.read(4096), timeout=timeout)
                    if not data:
                        break
                    response += data
                writer.close()

                await writer.wait_closed()
                return response.decode()
            except asyncio.TimeoutError:
                print(f"Попытка {attempt+1}: Превышено время ожидания соединения.")
        print("Все попытки подключения завершились неудачно.")
        return None
    except Exception as e:
        print(f"Произошла ошибка при выполнении запроса: {e}")
        return None
```

Изменения внесены в строку `data = await asyncio.wait_for(reader.read(4096), timeout=timeout)`, где установлено ограничение по времени ожидания при чтении данных из потока. Теперь при каждой попытке чтения данных будет применяться указанный таймаут.

Теперь при вызове функции `connect_whois_server` можно указать параметры `timeout` и `attempts`, чтобы установить ограничения по времени и количеству попыток подключения:

```python
response = await connect_whois_server(domain="example.com", server="whois.verisign-grs.com", timeout=5, attempts=3)
``` 

В данном примере установлено время ожидания 5 секунд и 3 попытки подключения к серверу WHOIS для домена example.com.
И то и другое делается руками. 
Для таймаута, заверни вызов open_connection() в вызов asyncio.wait_for().
Для нескольких попыток, for _ in range(попыток) .
Похожие вопросы