0
Отвечен

ReadTimeout: The read operation timed out

Пользователь 162592 2 года назад обновлен Антон Жиянов 2 года назад 8

Добрый день, использую библиотеку Dadata для работы в Python.

После обработки 3300 записей выполнение запросов остановилось с ошибкой

ReadTimeout: The read operation timed out

На счете средств достаточно, при ручном повторном запуске, выполнение запросов продолжилось.

В чем ошибка?

интерфейс: api

Ответ

Ответ
На рассмотрении

Добрый день! Пакет dadata для Python использует таймаут в 3 секунды. Ошибка "read operation timed out" указывает на то, что сервер не ответил за это время. Причина может быть в каких-то временных сетевых проблемах, либо особенностях данных в самом запросе.

Ответ
На рассмотрении

Добрый день! Пакет dadata для Python использует таймаут в 3 секунды. Ошибка "read operation timed out" указывает на то, что сервер не ответил за это время. Причина может быть в каких-то временных сетевых проблемах, либо особенностях данных в самом запросе.

Далее наблюдается одна и та же картина
около 7 тыс запросов и разные ошибки.

Были:

ConnectTimeout: _ssl.c:980: The handshake operation timed out

RemoteProtocolError: Server disconnected without sending a response.

Если они все связаны с "таймаут в 3 секунды", возможно ли этот параметр настроить отдельно

Кажется нашел, что дело в ограничении: 20 запросов в минуту

Ограничения в 20 запросов в минуту не существует. Ошибка ConnectTimeout не связана с таймаутом на чтение данных — здесь причина скорее в сети.

Убедитесь, что вы не создаете экземпляр Dadata на каждый запрос, а создали один экземпляр в начале и дальше переиспользуете его.

Можете попробовать обрабатывать исключения и повторять запрос (если таких исключений немного). Если много — имеет смысл разбираться с сетью (работа фаервола, прокси, нестабильный интернет, и так далее).

Работаю внутри

with Dadata(token, secret) as dadata:

Пробовал запускать через исключение

try:
js = dadata.clean(name='address', source=adres)
except (RemoteProtocolError, ReadTimeout, ConnectTimeout):
time.sleep(30)
js = dadata.clean(name='address', source=adres)

но в такой форме хоть и дает отработать больше запросов, но все равно потом ругается, что не знает имени "RemoteProtocolError", хотя сам ранее выдавал такую ошибку.

не знает имени "RemoteProtocolError"

Это проблема в вашем Python-коде. Скорее всего, не импортировали соответствующий класс.

Сервис поддержки клиентов работает на платформе UserEcho