Как корректно завершить выполнение бесконечного запроса методом request.post()?

Как можно корректно завершить поток, который выполняет запрос с помощью requests.post() и может привести к бесконечной загрузке аудиофайла? Параметр timeout в функции requests не дает ожидаемого результата в данном случае.
  • 19 сентября 2023 г. 18:57
Ответы на вопрос 3
Если запрос с помощью `requests.post()` длится слишком долго и установка параметра `timeout` не приводит к ожидаемому результату, можно попробовать применить следующий подход:

1. Используйте модуль `threading`, чтобы выполнять запрос в отдельном потоке.
2. Установите флаг `daemon` для потока, чтобы он завершился, когда все не-демонические потоки завершатся.
3. Установите время ожидания для запроса вручную и завершите поток, если время ожидания истекло.

Вот пример кода:

```python
import requests
import threading

def perform_request():
    try:
        response = requests.post(url, data=payload, timeout=10)  # Установите разумное значение таймаута
        response.raise_for_status()  # Обработайте возможные ошибки
        # Обработайте полученные данные
    except requests.exceptions.Timeout:
        print("Время ожидания истекло. Завершение запроса.")

# Создаем поток
request_thread = threading.Thread(target=perform_request)
request_thread.daemon = True

# Запускаем поток
request_thread.start()

# Далее можно продолжить выполнять другие действия в основном потоке

# Чтобы завершить основной поток, нужно либо явно вызвать sys.exit() или завершить все не-демонические потоки
# В данном случае, если все не-демонические потоки завершатся, то и поток request_thread тоже завершится
```

Обратите внимание, что таймаут в `requests.post()` устанавливает время ожидания для установления соединения, а не время загрузки всего запроса. Поэтому, в некоторых случаях, этот подход с использованием отдельного потока может сработать лучше, чем просто установка таймаута.
r = requests.get('https://github.com', timeout=(3.05, 27)) 
 Документация: [ссылка](https://docs.python-requests.org/en/latest/user/advanced/#timeouts)
Похожие вопросы