Когда urllib2.request
достигает таймаута, исключение составляет urllib2.URLError
. Что такое pythonic способ повторного установления соединения?Как повторить попытку urllib2.request при сбое?
ответ
Я бы использовал декоратор retry. Есть и другие, но это работает очень хорошо. Вот как вы можете использовать его:
@retry(urllib2.URLError, tries=4, delay=3, backoff=2)
def urlopen_with_retry():
return urllib2.urlopen("http://example.com")
Это будет повторять функцию, если URLError
поднята. Проверьте ссылку выше для документации по параметрам, но в основном она будет повторять максимум 4 раза, при этом экспоненциальная задержка отсрочки удваивается каждый раз, например. 3 секунды, 6 секунд, 12 секунд.
Это действительно классный фрагмент. Вы знаете альтернативу, но как менеджер контекста? –
Хмм, я думаю, вы могли бы, вероятно, переписать его в качестве менеджера контекста довольно легко, но у меня нет одного из них. – jterrace
Это непросто сделать, поскольку нет простого способа захватить блок внутри оператора. Вам нужна глубокая интроспекция. –
Чтобы повторить попытку по истечении времени ожидания можно поймать исключение, как @Karl Barker suggested in the comment:
assert ntries >= 1
for _ in range(ntries):
try:
page = urlopen(request, timeout=timeout)
break # success
except URLError as err:
if not isinstance(err.reason, socket.timeout):
raise # propagate non-timeout errors
else: # all ntries failed
raise err # re-raise the last timeout error
# use page here
Есть несколько библиотек там, которые специализируются на этом.
Первый - backoff, который разработан с особенно функциональной чувствительностью. Декораторам передаются произвольные вызывающие обратные генераторы, которые дают последовательные значения задержки. Простая экспоненциальная потеря мощность с максимальным временем повтора 32 секунд может быть определена как:
@backoff.on_exception(backoff.expo,
urllib2.URLError,
max_value=32)
def url_open(url):
return urllib2.urlopen("http://example.com")
Другим retrying, который имеет очень похожую функциональность API, но где повторить параметры задаются посредством заранее определенных аргументов ключевых слов.
- 1. Как повторить попытку ajax при сбое в реакции js?
- 2. Повторить попытку ошибки SFTP
- 3. Как я могу «повторить попытку»?
- 4. urllib2.Request 404 исключение
- 5. Попросите повторить попытку при сбое вызова API сети с помощью ReactiveCocoa
- 6. Как повторить попытку после исключения в python?
- 7. Sails.JS - повторить попытку NTLM Auth?
- 8. повторить попытку в простой цикл
- 9. Интеграция Facebook «произошла ошибка повторить попытку позже»?
- 10. Как автоматически повторить попытку подключения SFTP?
- 11. Как повторить попытку с задержкой в Camel
- 12. Как правильно повторить попытку утверждения на узле?
- 13. iOS NSURLSession, как повторить попытку в didCompleteWithError
- 14. Исключения и как лучше повторить попытку при сбросе соединения?
- 15. HornetQ повторить механизм, когда исходящая база данных при сбое
- 16. Как повторить асинхронную запись при сбое в datastax-jdbc?
- 17. Повторить попытку после urllib2.URLError: <urlopen error [Errno 111] Connection отказано>
- 18. Повторить попытку сбоя при установке запланированной задачи с помощью PowerShell
- 19. Как повторить попытку Неудача потока запросов akka-http?
- 20. Быстрая логика «повторить попытку» по запросу
- 21. RxJava повторить попытку, сброшенную внутри doOnNext
- 22. Исключить исключение, но повторить попытку с Sidekiq
- 23. локона повторить попытку по истечению времени ожидания
- 24. Socket.io неудача разрешение не повторить попытку восстановить
- 25. Повторить попытку не работать с FaultTolerantStepBuilder
- 26. erase_results и повторить попытку в рельсах 3.1.3
- 27. Повторить попытку запроса ajax в vuejs
- 28. RequireJS: повторить попытку загрузки сценария загрузки
- 29. Dropzone.js повторить попытку, если ajax не удалось
- 30. Проверка urllib2.Request атрибутов при использовании OpenerDirector с обработчиками
Этот вопрос должен ответить на ваш вопрос: http://stackoverflow.com/questions/2712524/handling-urllib2s-timeout-python –
Я не спрашивал, как поймать искупление. Я хотел знать, есть ли путинский способ повторной попытки установить соединение. – iTayb
Извините, я решил, что проблема заключается в обнаружении тайм-аута, а не в восстановлении соединения. Не могли бы вы вызвать urlopen() в блоке исключений? –